ArrayList LinkedList Vector 区别

来源:互联网 发布:手机淘宝一键秒杀神器 编辑:程序博客网 时间:2024/06/06 09:30

这两天看到了一些好的文章收获很大,正好趁着中秋节有时间,就把他们翻译下,加深理解。

List概述

List是由有序元素组成的序列,当我们谈到List的时候往往会想到set,set是由没有重复无序的元素组成的。下边这是collections的类图,从这个类图中,你可以对java 的 collections有一个大致的了解。


ArrayList、LinkedList和Vector比较

从上边这个类图中,我们可以看到,这三者都实现了List接口,他们使用起来非常接近。他们主要的区别是各自的实现方式的不同导致了操作性能的不同。
ArrayList是可变大小数组的实现,随着加入到ArrayList中的元素越来越多,它的长度是动态增加的。由于ArrayList是数组,所以可以通过get和set方法来对元素进行直接的访问。
LinkedList是双向链表的实现,,在remove和add方法上它的性能优于ArrayList,但是在get和set方法上它的性能又劣于ArrayList。
Vector和ArrayList是相似的,但是vector是同步的。
如果你的程序是线程安全的那么ArrayList是更好的选择。Vector和ArrayList都需要比存储的元素更大的空间,Vector每次都要比现在的空间扩大一倍,但是ArrayList每次只需要比现在的空间扩大50%。但是,LinkedList也实现了queue接口,这就比ArrayList和Vector增加了更多的方法,比如:offer(),peek(),poll()等等。
注:ArrayList的初始容量很小,利用ArrayList构建一个较高的初始容量是一个好的习惯,因为这样可以避免调整的代价。

ArrayList 例子

[java] view plaincopy
  1. ArrayList<Integer> al = new ArrayList<Integer>();  
  2. al.add(3);  
  3. al.add(2);        
  4. al.add(1);  
  5. al.add(4);  
  6. al.add(5);  
  7. al.add(6);  
  8. al.add(6);  
  9.    
  10. Iterator<Integer> iter1 = al.iterator();  
  11. while(iter1.hasNext()){  
  12.     System.out.println(iter1.next());  
  13. }  

LinkedList 例子

[java] view plaincopy
  1. LinkedList<Integer> ll = new LinkedList<Integer>();  
  2. ll.add(3);  
  3. ll.add(2);        
  4. ll.add(1);  
  5. ll.add(4);  
  6. ll.add(5);  
  7. ll.add(6);  
  8. ll.add(6);  
  9.    
  10. Iterator<Integer> iter2 = ll.iterator();  
  11. while(iter2.hasNext()){  
  12.     System.out.println(iter2.next());  
  13. }  
从上边这两个例子可以看出,他们的用法非常接近,他们真正的区别是他们内在的实现和操作的复杂性。

Vector

Vector和ArrayList几乎相同,不同的是Vector是synchronized(同步的),真因为如此他的开销要比ArrayList大。通常情况下,程序员们使用ArrayList代替Vector,因为他们自己可以明确的对程序进行同步处理。

ArrayList和LinkedList和性能比较

时间复杂度的比较如下:



表中的add()指的是add(E e),remove指的是remove(int index)。对于任意一个元素的add和remove,ArrayList具有O(n)的时间复杂度,但是对于最后一个元素它具有O(1)的时间复杂度。对于任意一个元素的add和remove,LinkedList具有O(n)的时间复杂度,但是对于list的头和尾只具有O(1)复杂度。
我使用下面的代码来测试他们的性能:
[java] view plaincopy
  1. ArrayList<Integer> arrayList = new ArrayList<Integer>();  
  2. LinkedList<Integer> linkedList = new LinkedList<Integer>();  
  3.    
  4. // ArrayList add  
  5. long startTime = System.nanoTime();  
  6.    
  7. for (int i = 0; i < 100000; i++) {  
  8.     arrayList.add(i);  
  9. }  
  10. long endTime = System.nanoTime();  
  11. long duration = endTime - startTime;  
  12. System.out.println("ArrayList add:  " + duration);  
  13.   
0 0
原创粉丝点击