ArrayList LinkedList Vector之间的区别

2022-11-06,,,

List主要有ArrayList,LinkedList和vector三种实现。这三种都实现了List接口,使用方式也很相似,主要区别在于其实现方式的不同!

这三种数据结构中,ArrayList和Vector只实现了List接口,而LinkedList同时实现了List接口和Queue接口。所以,LinkedList既是一个列表,

也是一个队列。

1.底层数据结构

  ArrayList和Vector是采用数组来存储元素的。数组的特点就是可以方便的通过下标来访问其中的某一个元素,但是想要向其中插入或者删除数据1时就会导致很多数据元素移动位置。

  LiinkedList是采用双向链表来存储元素的。链表的特点就是元素的插入和删除比较方便,因为它使用链表,所以不需要移位。但是想要查找其中的一个元素,就需要i从头开始遍历。

  因为底层的实现方式不同,也就决定了ArrayList和Vector更加适合查找操作比较多的场景,而LinkedList适合插入和删除操作较多的场景。

2.扩容机制

  因为ArrayList和Vector是基于数组实现的,数组在初始化的时候需要指定容量,随着元素越来越多,就需要对数组进行扩容!

  ArrayList中的grow方法,用于扩大数组容量!

  private static final int DEFAULT_CAPACITY = 10;

  ArrayList中数组初始化默认容量是10;

  其中扩充容量的代码主要是

  int newCapacity = oldCapacity + (oldCapacity >> 1);
  表示扩容后的数组容量是扩充前数组容量的1,5倍
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
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:
elementData = Arrays.copyOf(elementData, newCapacity);
}

  Vector中的扩容方法如下:依旧是grow方法

private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
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);
}

  capacityIncrement是用户可以指定的扩容是增加的容量大小,也就是说,如果用户指定了这个数值X,那么扩容后的容量就是扩容先容量oldcapicity + X,

如果没有指定这个数值,或这个数值小于等于0,那么扩容后的容量 = 扩容前的容量的2倍!!!!

  主要扩容机制语句:

  int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);

3.线程安全性

  在这三种数据结构中,有一种数据结构是线程安全的,那就是Vector,它的所有方法都是加了锁的,可以防止并发的发生。

  

综上,从适应场景来说,ArrayList适合非并发场景,查找操作较多,Vector适合并发场景,查找操作比较多;LinkedList适合非并发场景,插入,删除操作比较多

-----------------------------------------------------------------------------------参考《深入理解Java核心技术》

ArrayList LinkedList Vector之间的区别的相关教程结束。

《ArrayList LinkedList Vector之间的区别.doc》

下载本文的Word格式文档,以方便收藏与打印。