成员变量:
// 序列化ID private static final long serialVersionUID = 8683452581122892189L; // 默认初始化容量 private static final int DEFAULT_CAPACITY = 10; // 空的数组 private static final Object[] EMPTY_ELEMENTDATA = {}; // 默认容量的空数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 真正存放对象的数组 transient Object[] elementData; // 容器的大小 private int size; // 操作计数 protected transient int modCount = 0;
初始化:
/** *带int形参的构造函数ArrayList(int initialCapacity),函数首先判断initialCapacity *是否为0,如果是0,则将EMPTY_ELEMENTDATA赋值给elementData,如果大于0,就将*elementData初始化为一个容量为initialCapacity的对象数组 */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //参数不合法导致抛出异常 } }
如下代码:指定默认容量大小为0,则将EMPTY_ELEMENTDATA赋值给elementData
ArrayList<String> arrayList=new ArrayList<>(0); arrayList.add("222"); arrayList.add("444");
给集合添加元素把一个元素添加到elementData中,要做这个之前,要扩容public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
如果
EMPTY_ELEMENTDATA
是由DEFAULTCAPACITY_EMPTY_ELEMENTDATA
赋值而成,那么就将扩容的数量minCapacity
和DEFAULT_CAPACITY
进行比较,然后取其中的最大值,最大值再传参给ensureExplicitCapacity
函数,ensureExplicitCapacity(minCapacity)方法,在这个方法中先将操作数记录值modCount
自增,然后根据minCapacity
和elementData.length
的大小来决定是否需要增加容量private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); //原来容量的1.5陪 if (newCapacity - minCapacity < 0) //如果当前容量还没达到 1.5 倍旧容量,就使用当前容量 newCapacity = minCapacity; //newCapacity 变为10 if (newCapacity - MAX_ARRAY_SIZE > 0) //与最大容量相比 newCapacity = hugeCapacity(minCapacity); //当想要分配比 MAX_ARRAY_SIZE 大的个数就会报 OutOfMemoryError。 // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
Arraylist源码分析扩容
最新推荐文章于 2022-08-20 00:31:18 发布