1.特色:数组
ArrayList
是一个动态数组,它是线程不安全的,容许元素为null安全
可重复,插入有序并发
读写快,增删慢性能
扩容:默认容量 10,默认扩容1.5倍this
建议指定容量大小,减小扩容带来的性能消耗spa
2.构造方法.net
只分析复杂的线程
public ArrayList(Collection<? extends E> c)code
c.toArray() 在Collection接口中定义的接口方法,ArrayList中调用的是Arrays.copyOf(elementData, size)方法(注:扩容也是使用此方法,高频率方法),调用的是System.arraycopy blog
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
2.add
每次 add以前,都会判断add后的容量,是否须要扩容
默认扩容倍数1.5倍,若是扩容1.5倍后小于传入的容量大小,则使用传入的容量大小,单最大不能大于Integer.MAX_VALUE;
每次扩容都会修改modCount
public boolean add(E e)
public void add(int index, E element)
public void add(int index, E element) { rangeCheckForAdd(index);//越界判断 若是越界抛异常 ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); //将index开始的数据 向后移动一位 elementData[index] = element; size++; }
addAll同理都须要先判断ensureCapacityInternal方法进行判断是否须要扩容,而后System.arraycopy进行数组赋值扩容
3.romove
public E remove(int index)
public boolean remove(Object o)
都是经过System.arraycopy进行数组赋值来达到效果,删除后原来,尾部元素,置空,gc
public boolean removeAll(Collection<?> c)
经过循环,和w标记,保存两个集合的非共有元素,共有元素置为null,gc
private boolean batchRemove(Collection<?> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { for (; r < size; r++) if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) { System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified; }
4.set和get
modCount不会改变,效率高
5.迭代器
public Iterator<E> iterator() { return new Itr(); }
内部类:private class Itr implements Iterator<E>
modCount != expectedModCount会抛出并发修改异常ConcurrentModificationException
先next,再remove(实质上是删除上一次next的元素),不然回报IllegalStateException异常
6.与Vector区别
Vector:线程安全,都在方法上加synchronized关键字
扩容:默认容量10,默认2倍扩容
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);