1
-
2
1
<!-- MarkdownTOC -->
3
2
4
3
- [ ArrayList简介] ( #arraylist简介 )
19
18
它继承于 ** AbstractList** ,实现了 ** List** , ** RandomAccess** , ** Cloneable** , ** java.io.Serializable** 这些接口。
20
19
21
20
在我们学数据结构的时候就知道了线性表的顺序存储,插入删除元素的时间复杂度为** O(n)** ,求表长以及增加元素,取第 i 元素的时间复杂度为** O(1)**
22
-
21
+
23
22
ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
24
-
23
+
25
24
ArrayList 实现了** RandomAccess 接口** ,即提供了随机访问功能。RandomAccess 是 Java 中用来被 List 实现,为 List 提供** 快速访问功能** 的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。
26
-
25
+
27
26
ArrayList 实现了** Cloneable 接口** ,即覆盖了函数 clone(),** 能被克隆** 。
28
-
27
+
29
28
ArrayList 实现** java.io.Serializable 接口** ,这意味着ArrayList** 支持序列化** ,** 能通过序列化去传输** 。
30
-
29
+
31
30
和 Vector 不同,** ArrayList 中的操作不是线程安全的** !所以,建议在单线程中才使用 ArrayList,而在多线程中可以选择 Vector 或者 CopyOnWriteArrayList。
32
31
### ArrayList核心源码
33
32
@@ -177,7 +176,7 @@ public class ArrayList<E> extends AbstractList<E>
177
176
newCapacity = minCapacity;
178
177
// 再检查新容量是否超出了ArrayList所定义的最大容量,
179
178
// 若超出了,则调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,
180
- // 如果minCapacity大于最大容量,则新容量则为ArrayList定义的最大容量 ,否则,新容量大小则为 minCapacity。
179
+ // 如果minCapacity大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE ,否则,新容量大小则为 MAX_ARRAY_SIZE。
181
180
if (newCapacity - MAX_ARRAY_SIZE > 0 )
182
181
newCapacity = hugeCapacity(minCapacity);
183
182
// minCapacity is usually close to size, so this is a win:
@@ -631,7 +630,7 @@ public class ArrayList<E> extends AbstractList<E>
631
630
newCapacity = minCapacity;
632
631
// 再检查新容量是否超出了ArrayList所定义的最大容量,
633
632
// 若超出了,则调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,
634
- // 如果minCapacity大于最大容量,则新容量则为ArrayList定义的最大容量 ,否则,新容量大小则为 minCapacity。
633
+ // 如果minCapacity大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE ,否则,新容量大小则为 MAX_ARRAY_SIZE。
635
634
if (newCapacity - MAX_ARRAY_SIZE > 0 )
636
635
newCapacity = hugeCapacity(minCapacity);
637
636
// minCapacity is usually close to size, so this is a win:
@@ -653,14 +652,14 @@ public class ArrayList<E> extends AbstractList<E>
653
652
654
653
3. .java 中的**size ()方法**是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
655
654
656
-
655
+
657
656
#### 内部类
658
657
```java
659
658
(1)private class Itr implements Iterator<E >
660
659
(2)private class ListItr extends Itr implements ListIterator<E >
661
660
(3)private class SubList extends AbstractList<E > implements RandomAccess
662
661
(4)static final class ArrayListSpliterator<E > implements Spliterator<E >
663
- ```
662
+ ```
664
663
ArrayList有四个内部类,其中的**Itr是实现了Iterator接口**,同时重写了里面的**hasNext ()**,**next ()**,**remove ()**等方法;其中的**ListItr**继承**Itr**,实现了**ListIterator接口**,同时重写了**hasPrevious ()**,**nextIndex ()**,**previousIndex ()**,**previous ()**,**set (E e )**,**add (E e )**等方法,所以这也可以看出了**Iterator和ListIterator的区别:**ListIterator在Iterator的基础上增加了添加对象,修改对象,逆向遍历等方法,这些是Iterator不能实现的。
665
664
### <font face="楷体" id="6"> ArrayList经典Demo</font>
666
665
0 commit comments