一、ArrayList详解

1.继承关系

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

 

2.属性

//默认的数组长度
private static final int DEFAULT_CAPACITY = 10;
//存储list中元素的数组,transient关键字表示该对象在ArrayList序列化时不被序列化。
transient Object[] elementData;
//数组中实际元素的个数
private int size;
//数组的最大长度
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

 

3.构造方法:

ArrayList的构造函数总共有三个:

(1)ArrayList()构造一个初始容量为 10 的空列表。
(2)ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
(3)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
所以如果调用List list = new ArrayList(10);会直接调用第三个构造函数。否则就需要扩容。
4.其他重要方法

1)add()添加元素:

 1     public boolean add(E e) {
 2         ensureCapacityInternal(size + 1);  // size为element数组的实际大小,若size+1<elementData.length,则不用动态扩容,否则需要将elementData进行动态扩容。
 3         elementData[size++] = e;
 4         return true;
 5     }
 6     private void ensureCapacityInternal(int minCapacity) {
 7         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
 8             minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
 9         }
10  
11         ensureExplicitCapacity(minCapacity);
12     }
13  
14     private void ensureExplicitCapacity(int minCapacity) {
15         modCount++;
16  
17         if (minCapacity - elementData.length > 0)
18             grow(minCapacity);
19     }
20     //grow:elementData数组扩容
21     private void grow(int minCapacity) {
22         int oldCapacity = elementData.length;
23     //每次增长newCapacity=oldCapacity*1.5,为原来的1.5倍
24         int newCapacity = oldCapacity + (oldCapacity >> 1);
25     //如果oldCapacity*1.5倍后,容量还是比minCapacity要小,则将newCapacity的值直接置为minCapacity
26         if (newCapacity - minCapacity < 0)
27             newCapacity = minCapacity;
28     //如果增长的新长度大于了MAX_ARRAY_SIZE,则调用hugeCapacity来获取一个不大于Integer.MAX_VALUE的值。
29         if (newCapacity - MAX_ARRAY_SIZE > 0)
30             newCapacity = hugeCapacity(minCapacity);
31     //重新申请一个newCapacity长度的数组空间,并把elementData数组中内容拷贝过去。
32         elementData = Arrays.copyOf(elementData, newCapacity);
33     }
34     //hugeCapacity: elementData的最大容量
35     private static int hugeCapacity(int minCapacity) {
36         if (minCapacity < 0) // overflow
37             throw new OutOfMemoryError();
38     //当最小保证的容量minCapacity比MAX_ARRAY_SIZE还大时,返回Integer.MAX_VALUE;否则直接返回MAX_ARRAY_SIZE
39         return (minCapacity > MAX_ARRAY_SIZE) ?
40             Integer.MAX_VALUE :
41             MAX_ARRAY_SIZE;
42     }
View Code

相关文章:

  • 2021-07-02
  • 2021-08-20
  • 2021-12-12
  • 2021-06-27
  • 2021-10-28
  • 2021-09-29
  • 2021-07-10
  • 2021-10-15
猜你喜欢
  • 2021-11-23
  • 2021-11-04
  • 2021-12-30
  • 2022-12-23
  • 2021-06-22
  • 2021-08-10
  • 2022-12-23
相关资源
相似解决方案