ArrayList vs. LinkedList vs. Vector

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的性能

时间复杂度比较如下: 
arraylist-vs-linkedlist-complexity

*添加表中()是指添加(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
 

arraylist-vs-linkedlist

他们的表现的差异是显而易见的。 LinkedList更快在添加和删除,但速度较慢。 基于表的复杂性和测试的结果,我们可以找出何时使用ArrayList或LinkedList。 总之,LinkedList应该首选如果: 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值