ArrayList和Vector的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList和Vector的区别相关的知识,希望对你有一定的参考价值。
这些都是自己总结,若是有不对的地方请指出:
相同处:ArrayList和Vector底层都是用数组实现的
ArrayList源码里是这么写的:
transient Object[] elementData;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
Vector源码:
protected Object[] elementData;
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//这步说明他底层是数组结构如果是空构造那么默认的数组长度是10
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
先不用管代码有多复杂,看一下构造。
总结一下:第一个:Vector和ArrayList底层都是数组实现的。
第二个就是若开始都是用空构造则默认的数组长度都为10
不同处:第一个:最明显的一个是Vector是线程安全的(通过实现synchronize方法)而ArrayList是线程不安全的
第二个:ArrayList如果需要扩容新数组的长度是原来数组的1.5倍。而Vector是原来的两倍
Vector:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//这里可以看出2倍扩容机制
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
ArrayList:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//这里也可以看出ArrayList是1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
ArrayList和Vector的扩容机制差不多,不清楚的同学可以去看看源码,一个看懂了另一个就不难了。
以上是关于ArrayList和Vector的区别的主要内容,如果未能解决你的问题,请参考以下文章
ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilderStringBuffer和String的区别?