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是增加自己的一倍。
众所周知,我们常用的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是增加自己的一倍。
相关文章推荐
- Java集合:LinkedList使用详解及源码分析
- Java集合源码之路-List分析(一)续
- java 源码分析Arrays.asList方法详解
- Java集合:Hashtable使用详解及源码分析
- Java集合2-HashMap详解(含源码分析)
- Java集合源码学习笔记(三)LinkedList分析
- Java 集合框架源码分析(二)——LinkedList
- Java集合之LinkedList源码分析
- JAVA集合源码分析系列:LinkedList源码分析
- java 集合框架之LinkedList及ListIterator实现源码分析
- Java集合源码学习(三)LinkedList分析
- Java集合:ArrayList使用详解及源码分析
- Java集合之LinkedList源码分析
- java集合LinkedList源码分析1
- Java 集合体系之 LinkedList 源码分析
- Java集合源码之路-List分析(二)
- Java集合源码分析(二)Linkedlist
- Java集合之LinkedList源码分析
- java_集合体系之:LinkedList详解、源码及示例——04
- Java集合源码之路-List分析(一)