ArrayList和Vector的区别
同:
1、都是动态数组。
2、如果不指定容量,那么初始容量都是10.
3、都继承AbstractList类。
4、都支持序列化和克隆,因为实现了Cloneable,Serializable。
5、遍历方式相同:都可以使用Iterator,ListIterator。
异:
1、线程安全不同:
ArrayList是非线程安全的。
Vector是线程安全的。
2、构造函数不同:
ArrayList的构造:
ArrayList()
ArrayList(int capacity)
ArrayList(Collection<? extends E> collection)
Vector的构造函数:
Vector()
Vector(int capacity)
Vector(Collection<? extends E> collection)
Vector(int capacity, int capacityIncrement)
3、容量增加的方式不同
ArrayList: 容量不足时---》新的容量=(原始容量*3)/2+1.
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
Vector:
和增长系数有关,若指定了增长系数:
且增长系数大于0,那么容量不足时---》新的容量=原始容量+增长系数
若增长系数小于0,那么容量不足时---》新的容量=原始容量*2.
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object[] oldData = elementData;
int newCapacity = (capacityIncrement > 0) ?
(oldCapacity + capacityIncrement) : (oldCapacity * 2);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
4、对Enumeration的支持不同,Vector可以使用这个遍历,而ArrayList不可以。
public Enumeration<E> elements() {
return new Enumeration<E>() {
int count = 0;
public boolean hasMoreElements() {
return count < elementCount;
}
public E nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return (E)elementData[count++];
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}