1。 列表概述
列表,如它的名字所表明的那样,是一个有序序列的元素。 当我们谈论列表,这是一个好主意,和组是一组比较独特和无序元素。 下面是集合的类层次图。 从那你可以大致的Java集合。
2。 ArrayList、LinkedList、Vector之间的关系
从层次结构关系图,他们都实现 列表 接口。 他们非常类似于使用。 他们的主要区别是它们的实现不同的操作导致不同的性能。
arraylist 被实现为一个可调整大小的数组。 随着越来越多的元素被添加到ArrayList,它的大小是动态增加。 可以直接访问它的元素通过使用get和set方法,因为ArrayList本质上是一个数组。
linkedlist 被实现为一个双链表。 添加和删除它的性能是优于Arraylist,但是更糟糕的是获取和设置方法。
向量 ArrayList是相似的,但它是同步的。
ArrayList是更好的选择,如果您的程序是线程安全的。 向量和ArrayList需要更多的空间,更多的元素。 向量每次双打数组大小,而ArrayList每次它的规模增长50%。 然而,LinkedList实现 队列 接口,增加了更多的方法比ArrayList和向量,如提供(),peek(),调查(),等等。
注意:默认初始容量的ArrayList相当小。 这是一个好习惯构建更高的初始容量的ArrayList。 这可以避免调整成本。
3。 ArrayList的例子
ArrayList<Integer> al = new ArrayList<Integer>(); al.add(3); al.add(2); al.add(1); al.add(4); al.add(5); al.add(6); al.add(6); Iterator<Integer> iter1 = al.iterator(); while(iter1.hasNext()){System.out.println(iter1.next()); } |
4。 LinkedList的例子
LinkedList<Integer> ll = new LinkedList<Integer>(); ll.add(3); ll.add(2); ll.add(1); ll.add(4); ll.add(5); ll.add(6); ll.add(6); Iterator<Integer> iter2 = ll.iterator(); while(iter2.hasNext()){System.out.println(iter2.next()) ; } |
上面的示例所示,它们类似于使用。 真正的区别是他们的底层实现和操作的复杂性。
5。 向量
ArrayList向量是几乎相同的,所不同的是,向量是同步的。 正因为如此,它有一个比ArrayList开销。 通常情况下,大多数Java程序员使用ArrayList相反的向量,因为他们可以明确自己同步。
6。 ArrayList vs LinkedList的性能
时间复杂度比较如下:
*添加表中()是指添加(E E)和删除()是指删除(int指数)
- 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更快在添加和删除,但速度较慢。 基于表的复杂性和测试的结果,我们可以找出何时使用ArrayList或LinkedList。 总之,LinkedList应该首选如果: