ArrayList、LinkedList、Vector三者比较

1. List概览

    List顾名思义,就是一系列有序元素的集合。当我们说道List时,通常要和Set进行比较。Set是不重复的无序元素的集合。

    下面是集合的类层次结构图,你从中可以大概了解我将要谈论的内容。


2. ArrayList vs LinkedList vs Vector

    从上面的层次结构图中可以看出,ArrayList、LinkedList、Vector都实现了List接口。它们的用法十分的相似,而主要的区别在于,由于它们实现的方式不同,在不同的应用场景下,它们的性能有所差异。

    ArrayList是基于一个长度可变的数组实现的。当较多的元素被添加入ArrayList,它的长度就回动态增加。可以使用get和set方法直接获取ArrayList中的元素。ArrayList本质上是一个数组。LinkedList是基于双向链表实现的。它在add和remove上的性能优于ArrayList,但在get和set上的表现就较差。Vector和ArrayList类似,但它是同步的。如果你的程序是线程安全的,选择ArrayList比较好。当添加更多新元素的时候,Vector和ArrayList需要新的空间,其中,每次Vector空间大小增长为原来的两倍,而ArrayList的空间大小比原来增加了50%。

    LinkedList除了实现了List接口外,还实现了Queue接口,因此它比ArrayList和Vector多了一些方法,如offer()、peek()、poll()等。

    注意:ArrayList默认的初始容量很小,所以在创建ArrayList时最好指定一个较大的初始容量,以避免重新分配空间产生的资源损耗。

3. ArrayList示例

ArrayList<Integer> a1 = new ArrayList<Integer>();
a1.add(3);
a1.add(2);
a1.add(1);
a1.add(4);
a1.add(5);
a1.add(6);
a1.add(6);

Iterator<Integer> iter1 = a1.iterator();
while(iter1.hasNext()) {
    System.out.println(iter1.next());
}

4. LinkedList示例

LinkedList<Integer> l1 = new LinkedList<Integer>();
l1.add(3);
l1.add(2);
l1.add(1);
l1.add(4);
l1.add(5);
l1.add(6);
l1.add(6);

Iterator<Integer> iter2 = l1.iterator();
while(iter2.hasNext()) {
    System.out.println(iter2.next());
}

5. Vector

    Vector基本上和ArrayList一样,唯一的区别是Vector是同步的。因此,Vector比ArrayList稍微高级一点儿。通常,绝大多数Java程序员会自己实现对同步的精确控制,因此,他们通常会选择ArrayList而不是Vector。

6. ArrayList和LinkedList性能比较

    ArrayList和LinkedList的时间复杂度比较如下:

 ArrayListLinkedList
get()O(1)O(n)
add()O(1)O(1)amortized
remove()O(n)O(n)

    *表格中,add()指的是add(E e),remove()指的是remove(int index)

    ① ArrayList在任意位置的添加/移除操作的时间复杂度是O(n),而在尾部的添加/移除操作的时间复杂度是O(1);

    ② LinkedList在任意位置的增加/移除操作的时间复杂度是O(n),而在首部/尾部的增加/移除操作的时间复杂度是O(1)。

    我用下面的代码测试它们的性能:

ArrayList<Integer> arrayList = new ArrayList<Integer>();
LinkedList<Integer> linkedList = new LinkedList<Integer>();
 
// 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)操作上速度较快,但在访问(get)上速度较慢。根据上面的复杂度表和测试结果,我们可以总结出使用ArrayList和LinkedList的场景。简单来说,LinkedList适合在以下情况使用:

① 无需大量地对元素进行随机访问;

② 需要进行大量的添加/移除(add/remove)操作。

原文地址:ArrayList vs. LinkedList vs. Vector

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值