ArrayList vs. LinkedList vs. Vector
来源:互联网 发布:双十一每年数据 编辑:程序博客网 时间:2024/05/21 14:58
1. List概览
List,就像它的名字暗示的一样,是一组排列有序的元素。当我们讨论List的时候,很容易将它和Set作比较。Set是一组唯一的而且排列无序的元素。
下图是集合类的层次结构图。你可以总体上知道我们今天讨论的主题。
2. ArrayList vs. LinkedList vs. Vector
从上图可知,它们都实现了List接口。它们的用法差不多,主要的区别在于它们对于不同操作的操作速度不同。
ArrayList是可以改变大小的数组。当有元素添加到ArrayList中去时,它的大小动态的增加。元素可以直接通过get()和set()方法进行访问,因为ArrayList实际上是数组。LinkedList是个双向链表。它的add()和remove()方法比ArrayList快,但是get()和set()方法却比ArrayList慢。Vector和ArrayList类似,但是Vector是同步的。如果在线程安全的环境下,使用ArrayList是更好的选择。添加元素的时候,当超过初始容量的时候,Vector和ArrayList需要更多的空间:Vector需要将数组的大小增加一倍,而ArrayList需要增加50%。
LinkedList还实现了Queue接口,这样就比ArrayList和Vector多出了一些方法如offer(), peek(), poll()等。
注意:ArrayList的初始容量(initial capacity)很小。我们应该设置一个比较大的初始容量,这样可以避免重新改变大小。
3. ArrayList的例子
ArrayList al =
new
ArrayList();
al.add(
3
);
al.add(
2
);
al.add(
1
);
al.add(
4
);
al.add(
5
);
al.add(
6
);
al.add(
6
);
Iterator iter1 = al.iterator();
while
(iter1.hasNext()){
System.out.println(iter1.next());
}
4. LinkedList的例子
LinkedList ll =
new
LinkedList();
ll.add(
3
);
ll.add(
2
);
ll.add(
1
);
ll.add(
4
);
ll.add(
5
);
ll.add(
6
);
ll.add(
6
);
Iterator iter2 = ll.iterator();
while
(iter2.hasNext()){
System.out.println(iter2.next());
}
由上可见,它们的用法相同,主要的区别在于它们内部的实现,以及操作的复杂度的不同。
5. Vector
Vector几乎和ArrayList相等,主要的区别在于Vector是同步的。正因为此,Vector比ArrayList的开销更大。通常大部分程序员都使用ArrayList,他们可以自己写代码进行同步。
6. ArrayList vs. LinkedList的性能比较
时间复杂度如下:
* 表中的add()指的是add(E e)(即是在列表末尾添加元素),remove()方法指的是remove(int index)。
ArrayList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的尾部的操作时间为O(1)。
LinkedList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的头部或尾部的操作时间为O(1)。
(译者注:这里原文解释的不是太清楚。对于任意索引的插入/删除操作
Arrays:
- 找到插入/删除位置的时间复杂度是O(1)
- 进行插入/删除操作的时间复杂度是O(n)
Linked Lists:
- 找到插入/删除位置的时间复杂度是O(n)
- 进行插入/删除操作的时间复杂度是O(1)
)
我使用下面的代码测试它们的性能:
ArrayList arrayList =
new
ArrayList();
LinkedList linkedList =
new
LinkedList();
// ArrayList add
long
startTime = System.nanoTime();
for
(
int
i =
0
; i <
100000
; i++) {
arrayList.add(i);
}
long
endTime = System.nanoTime();
long
duration = endTime - startTime;
System.out.println(
"ArrayList add: "
+ duration);
// LinkedList add
startTime = System.nanoTime();
for
(
int
i =
0
; i <
100000
; i++) {
linkedList.add(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(
"LinkedList add: "
+ duration);
// ArrayList get
startTime = System.nanoTime();
for
(
int
i =
0
; i <
10000
; i++) {
arrayList.get(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(
"ArrayList get: "
+ duration);
// LinkedList get
startTime = System.nanoTime();
for
(
int
i =
0
; i <
10000
; i++) { linkedList.get(i); } endTime = System.nanoTime(); duration = endTime - startTime; System.out.println(
"LinkedList get: "
+ duration);
// ArrayList remove startTime = System.nanoTime(); for (int i = 9999; i >=0; i--) {
arrayList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(
"ArrayList remove: "
+ duration);
// LinkedList remove
startTime = System.nanoTime();
for
(
int
i =
9999
; i >=
0
; i--) {
linkedList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(
"LinkedList remove: "
+ duration);
输出如下:
ArrayList add: 13265642
LinkedList add: 9550057
ArrayList get: 1543352
LinkedList get: 85085551
ArrayList remove: 199961301
LinkedList remove: 85768810
它们的性能的差别很显著。LinkedList对于add()和remove()相对于ArrayList要快,但是get()要慢些。按照复杂度以及测试结果来看,我们很容易知道什么时候该使用ArrayList,什么时候该使用LinkedList。简而言之,下面的情况该使用LinkedList:
- 如果没有大量的随机访问
- 如果有很多add/remove的操作
译文链接: http://www.importnew.com/8782.html
[ 转载请保留原文出处、译者和译文链接。]
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs. LinkedList vs. Vector
- ArrayList vs LinkedList vs Vector 区别
- 回首Java——ArrayList vs. LinkedList vs. Vector
- java的List集合们ArrayList vs. LinkedList vs. Vector
- LinkedList vs ArrayList
- ArrayList VS LinkedList
- Collections -- ArrayList vs LinkedList
- HDU
- 数学建模中的ARMA模型和ARIMA模型的使用实例(含代码)
- Presto单机/集群模式安装笔记
- 列表和元组
- The Moving Points HDU
- ArrayList vs. LinkedList vs. Vector
- 课程笔记之六:神经网络的代价函数和误差反向传播算法
- HDU
- 组装台式机流程
- ngui ui的坐标是相对父物体的中心点的坐标
- 05 java里的多态
- 可以重写静态方法吗?
- HDU 1423 && ZOJ 2432 (LCIS模板)
- 隐藏MainActivity自带的标题栏