ArrayList 、LinkedList、Vector的区别
ArrayList、LinkedList、Vector都是实现了List接口
-
ArrayList 本质上就是一个数组,当更多的元素添加到ArrayList中,其大小将会动态的进行增长,内部元素可以通过
get
与set
方法进行访问。elementData是Object类型的数组
transient Object[] elementData;
,保存添加到ArrayList中的数据。初始默认容量为initialCapacity,默认为DEFAULT_CAPACITY,容量为10 。size为ArrayList真正的容量,get
和set
操作时都会通过rangeCheck(int index)
方法对index进行判断,然后如果越界的话就会报出我们常见的IndexOutOfBoundsException异常。
private static final int DEFAULT_CAPACITY = 10;
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) { //为空时直接给赋值DEFAULT_CAPACITY
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
private void rangeCheck(int index) { //set get操作时进行的越界判断方法
if (index < 0 || index >= this.size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
-
LinkedList是一个双链表,因此在删除和添加元素的时候便优于数组形式的ArrayList,但是在get与set方面弱于ArrayList.
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。 Vector几乎和ArrayList相同,但是Vector是线程安全的。Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%。
//ArrayList中
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //通过位运算,每次增加50%
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:
elementData = Arrays.copyOf(elementData, newCapacity);
}
//Vector中
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity); //增加量为oldCapacity,即为增加一倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}