ArrayList 集合中怎么插入元素的
写一个测试方法,创建一个集合,看看到底是怎么执行插入操作的。
public static void test1(){
//创建一个集合
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(7);
list.add(5);
list.add(8);
System.out.println(list);
}
控制台输出:[1, 7, 5, 8]
ArrayList 提供了一个add()方法,当我们创建了一个集合对象,直接调用add()方法就可以插入指定类型的元素,但是add()方法到底是怎么向集合中插入元素的呢?下面我们来分析一下。
当执行插入操作的时候,首先 ensureCapacityInternal(size + 1)
,elementData[size] = e; size++;,这里的size是ArrayList中定义的表示集合大小的成员变量。
下边我们看add 调用的ensureCapacityInternal方法
elementData,EMPTY_ELEMENTDATA,DEFAULT_CAPACITY都是什么意思
也就是说当我们创建一个ArrayList集合的时候,默认会给我们分配一个容量为10的数组,至于怎么扩容,我们再看 grow方法
注意:这里传过来的minCapcatiy的值是size+1,能够实现grow方法调用就肯定是(size+1)>elementData.length的情况,所以size就是初始最大容量或上一次扩容后达到的最大容量,所以才会进行扩容。
newCapacity=oldCapacity+(oldCapacity>>1),这里就是扩容大小确定的地方,相当于新的最大容量是 size+1+size/2 相当于原来的1.5倍然后加1。
我们看到调用了Arrays工具类的 copyOf方法。
最后我们看一下System.arraycopy()
方法 ,会发现和remove()删除集合中的元素用的同一个方法,传送门arraycopy方法
ArrayList 底层是数组的形式,所以支持重复元素,如果没有指定大小,默认容量为10,当超过的默认容量的时候,会进行扩容,按照原来容量的1.5倍加1进行。当存入的集合数量一致增加时,会一直进行扩容操作,所以如果预先知道需要的集合的大小,可以直接创建一个指定大小的ArrayList集合,可以避免重复数组copy的扩容操作。