Java8 ArrayList源码分析

java8源码
ArrayList 总的来说就是一个动态数组,扩容时会变1.5倍容量

默认构造

一个空数组的arraylist

分析几个重要的方法

add(E)方法


每次调用此方法,会先检查是否需要扩容,,
ensureCapacityInternal(size + 1) ,,,默认 1.5倍扩容  int newCapacity = oldCapacity + (oldCapacity >> 1);
此时会修改modCount,,modCount用来检查并发修改异常,,,发现modCount出现变化就会抛出 throw new ConcurrentModificationException();

remove(int index) 方法


首先会检测索引范围 rangeCheck(index) 超过了就抛出 IndexOutOfBoundsException
修改 modCount  
索引旧的值 以便返回
数组删除索引之后的全部往前挪,System.arraycopy(elementData,index + 1, elementData, index, numRemoved)
数组最后一位置空,elementData[--size] = null; 让gc回收掉这个对象

get(int index) 方法


首先会检索范围 rangeCheck(index) 
返回索引对象 elementData[index]

set(int index,E element) 方法


范围检查
替换值 elementData[index] = element;

clear() 方法


修改modCount
数组所有位置 挨个设置成null,,,let gc work
size 设置成0

addAll(Collection c) 方法


将c容器变成数组 Object[] a = c.toArray(); toArray方法一般会将容器内容重新拷贝到一个新的数组里面去
检查是否需要扩容 oldSize + a.length
将a数组复制到ArrayList的数组
重新设置size += a.length;

iterator() 方法

,,return new Itr(); Itr是ArrayList的一个内部类。数据还是引用外部类ArrayList的数据,,并没有重新Copy一个
Itr 实现了Iterator 接口
hasNext() {
return cursor != size;
}
E next() {
检查并发修改
获取ArrayList.this.elementData;
返回获取的elementData[当前游标位置]
}


 

你可能感兴趣的:(java集合)