您的位置:首页 > 编程语言 > Java开发

Java 集合详解 二、List详解与源码分析

2017-07-16 17:16 459 查看
  在上一篇中,我们对Collection接口进行了分析,链接为  Java 集合详解 一、Collection详解 ,这一篇中,我们会继续讲解集合中的List类。

  众所周知,我们常用的List分为以下三种:



今天,我们就来从源码角度分析以下这三种List:

一、ArrayList、LinkedList、Vector的异同与使用场景

  一般来说,ArrayList与Vector都是使用数组来存储,LinkedList是使用双向链表进行存储,所以,ArrayList和Vector查找元素比较快,因为数组可以直接根据位置进行定位,而双向链表还需要根据链表头或者链表尾进行遍历查询。而在插入元素时,一般来说LinkedList比较快,因为双向链表只需要找到插入位置的前一个元素,然后进行插入即可(当然需要更改后一个元素的前驱),而因为数组是确定大小的,在尾部添加元素时,ArrayList与Vector都需要确认一下数组是否充足,如果不充足,还需要将数组进行扩大,再将原先的元素重新copy进去,而在中间插入元素时,ArrayList与Vector,ArrayList与Vector也需要确认一下数组是否充足,然后将插入位置的元素整体后移,所以一般来说,在插入元素时,LinkedList更快一些。

二、ArrayList、LinkedList源码分析与比较

  可以看我之前写的一篇博客 :  Java ArrayList与LinkedList源码分析与比较

三、ArrayList、Vector源码分析与比较

  比如add方法:

  ArrayList:

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}  Vector:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}  可以看到,ArrayList与Vector差别不大,不过Vector的add方法是线程安全的。

另外,在增加数组大小的grow()方法中
  ArrayList:

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:
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);
}  可以看到  ArrayList 一般是增加自己的一半,而Vector是增加自己的一倍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: