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<? extend E> 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[当前游标位置]
}