Vector和ArrayList区别,代码是完全一样的,不同的是:
- Vector的add方法加了synchronized
- Vector扩容时增长1倍,ArrayList扩容增长50%。
ArrayList
数据结构:使用数组存放数据
JDK1.6之前是初始化时扩容。JDK1.7是在add方法中扩容,默认是10,扩容时为旧数值的1.5倍。
-
线程是不安全的原因是因为size是静态变量。
public boolean add(E e) { /** * 添加一个元素时,做了如下两步操作 * 1.判断列表的capacity容量是否足够,是否需要扩容 * 2.真正将元素放在列表的元素数组里面 */ //注意:静态变量size,第一次调用add时为0,第二次为1,因为是后加1 ensureCapacityInternal(size + 1); //多线程并发时,size可能被其他线程变更过 elementData[size++] = e; return true; }
-
add方法扩容的代码
private void grow(int minCapacity) { //源数据的长度 int oldCapacity = elementData.length; //新长度 = 源数据长度+源数据长度的1.5倍数值. int newCapacity = oldCapacity + (oldCapacity >> 1); //新长度-最小扩容长度 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: //参数1:为源数组,参数2:新数组长度 elementData = Arrays.copyOf(elementData, newCapacity); }
-
remove方法的核心代码
System.arrayCopy(Object src, int srcPos,Object dest, int destPos, int length)
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。remove索引是高效的
remove性能有问题:for循环比较对象,再调用删除索引的方法
Vector
与ArrayList底层代码完全一致,除了synchronized,和数组扩增不同以外。