List概览

List,正如它的名字,表明其是有顺序的。当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一;下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整体架构;

ArrayList vs LinkedList vs Vector

从上面的类层次结构图中,我们可以发现他们都实现了List接口,它们使用起来非常相似。区别主要在于它们各自的实现,不同的实现导致了不同的性能和不同的操作。

ArrayList是为可变数组实现的,当更多的元素添加到ArrayList的时候,它的大小会动态增大。它的元素可以通过get/set方法直接访问,因为ArrayList本质上是一个数组。

LinkedList是为双向链表实现的,添加、删除元素的性能比ArrayList好,但是get/set元素的性能较差。

Vector与ArrayList相似,但是它是同步的。

如果你的程序是线程安全的,ArrayList是一个比较好的选择。当更多的元素被添加的时候,Vector和ArrayList需要更多的空间。Vector每次扩容会增加一倍的空间,而ArrayList增加50%。

注意:ArrayList默认的初始空间大小相当的小,通过构造函数去初始化一个更大的空间是一个好习惯,可以避免扩容开销。

ArrayList例子

  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. Iterator<Integer> iter1 = al.iterator();
  10. while(iter1.hasNext()){
  11. System.out.println(iter1.next());
  12. }

LinkedList例子

  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. Iterator<Integer> iter2 = ll.iterator();
  10. while(iter2.hasNext()){
  11. System.out.println(iter2.next());
  12. }

从以上代码,我们可以发现它们的使用非常相似,真正地区别在于它们的底层实现和操作复杂度。

Vector

Vector和ArrayList几乎是一样的,区别在于Vector是线程安全的,因为这个原因,它的性能较ArrayList差。通常情况下,大部分程序员都使用ArrayList,而不是Vector,因为他们可以自己做出明确的同步操作。

ArrayList和LinkedList性能对比

表中的add()方法指add(E e), remove()方法指remove(int index)

  • ArrayList对任意的add,remove操作,时间复杂度为O(n),但是在列表末尾的操作,其时间复杂度为O(1)。
  • LinkedList对任意的add,remove操作,时间复杂度为O(n),但是在列表末尾的操作,其时间复杂度为O(1)。

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

  1. package simplejava;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5.  
  6. public class Q24 {
  7.  
  8. public static void main(String[] args) {
  9. ArrayList<Integer> arrayList = new ArrayList<Integer>();
  10. LinkedList<Integer> linkedList = new LinkedList<Integer>();
  11.  
  12. // ArrayList add
  13. long startTime = System.nanoTime();
  14.  
  15. for (int i = 0; i < 100000; i++) {
  16. arrayList.add(i);
  17. }
  18. long endTime = System.nanoTime();
  19. long duration = endTime - startTime;
  20. System.out.println("ArrayList add: " + duration);
  21.  
  22. // LinkedList add
  23. startTime = System.nanoTime();
  24.  
  25. for (int i = 0; i < 100000; i++) {
  26. linkedList.add(i);
  27. }
  28. endTime = System.nanoTime();
  29. duration = endTime - startTime;
  30. System.out.println("LinkedList add: " + duration);
  31.  
  32. // ArrayList get
  33. startTime = System.nanoTime();
  34.  
  35. for (int i = 0; i < 10000; i++) {
  36. arrayList.get(i);
  37. }
  38. endTime = System.nanoTime();
  39. duration = endTime - startTime;
  40. System.out.println("ArrayList get: " + duration);
  41.  
  42. // LinkedList get
  43. startTime = System.nanoTime();
  44.  
  45. for (int i = 0; i < 10000; i++) {
  46. linkedList.get(i);
  47. }
  48. endTime = System.nanoTime();
  49. duration = endTime - startTime;
  50. System.out.println("LinkedList get: " + duration);
  51.  
  52. // ArrayList remove
  53. startTime = System.nanoTime();
  54.  
  55. for (int i = 9999; i >= 0; i--) {
  56. arrayList.remove(i);
  57. }
  58. endTime = System.nanoTime();
  59. duration = endTime - startTime;
  60. System.out.println("ArrayList remove: " + duration);
  61.  
  62. // LinkedList remove
  63. startTime = System.nanoTime();
  64.  
  65. for (int i = 9999; i >= 0; i--) {
  66. linkedList.remove(i);
  67. }
  68. endTime = System.nanoTime();
  69. duration = endTime - startTime;
  70. System.out.println("LinkedList remove: " + duration);
  71. }
  72.  
  73. }

结果打印如下:

ArrayList add: 13265642
LinkedList add: 9550057
ArrayList get: 1543352
LinkedList get: 85085551
ArrayList remove: 199961301
LinkedList remove: 85768810

它们性能的区别很明显。对于Add和remove操作,LinkedList性能较好,但是get操作性能较差。基于上面的时间复杂度表和测试结果,我们可以得出什么时候使用ArrayList还是LinkedList。简单的说,LinkedList适用于如下情况:

  • 没有大量的随机访问操作
  • 有大量的add/remove操作

译文链接:http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

  1.  

ArrayList vs LinkedList vs Vector的更多相关文章

  1. 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

    List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...

  2. java的List接口的实现类 ArrayList,LinkedList,Vector 的区别

    Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...

  3. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  4. 比较ArrayList、LinkedList、Vector

    翻译人员: 铁锚 翻译时间: 2013年12月2日 原文链接: ArrayList vs. LinkedList vs. Vector 1. List概述 List,就如图名字所示一样,是元素的有序列 ...

  5. Java 容器 & 泛型:二、ArrayList 、LinkedList和Vector比较

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 继续上一篇的容器文章认识容器,泥瓦匠慢慢带你们走进List的容器解说.今天泥瓦匠想说说 ArrayLi ...

  6. (自己转)比较ArrayList、LinkedList、Vector

    1. List概述 List,就如图名字所示一样,是元素的有序列表.当我们讨论List时,将其与Set作对比是一个很好的办法,Set集合中的元素是无序且唯一的.下图是Collection的类继承图,从 ...

  7. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  8. [Java]ArrayList、LinkedList、Vector、Stack的比较

    一.介绍 先回顾一下List的框架图 由图中的继承关系,可以知道,ArrayList.LinkedList.Vector.Stack都是List的四个实现类. AbstractList是一个抽象类,它 ...

  9. java中ArrayList、LinkedList、Vector的区别

    ArrayList.LinkedList.Vector这三个类都实现了List接口. ArrayList是一个可以处理变长数组的类型,可以存放任意类型的对象.ArrayList的所有方法都是默认在单一 ...

随机推荐

  1. aspNet各种模块介绍

    For browsers that do not support HTML5, you can use Modernizr. Modernizr is an open-source JavaScrip ...

  2. FireMonkey 导出目前 Style 另存文件

    FireMonkey 能将目前使用的 Style 导出成文件,它提供二种文件格式,请看下列代码: *.style procedure TForm1.Button1Click(Sender: TObje ...

  3. 高频sql语句汇总。不断更新。。

    操作 语句 创建数据库 CREATE DATABASE dbname/* DEFAULT CHARSET utf8 COLLATE utf8_general_ci;*/ 删除数据库 DROP DATA ...

  4. FileIputeStream用于读写文件,并且用字节的方式表示出来

    package com.Java; import java.io.FileInputStream; import java.io.FileNotFoundException; import java. ...

  5. 玩转Docker之安装篇(二)

    按理说,安装软件最好是按照官方文档进行,但由于国内网络的局限性,使我们不得不搭梯子,但终究太麻烦.鉴于此情况,我推荐方案一,利用某公司的加速站点来安装,而且是傻瓜式的,非常方便. 方案一: 在linu ...

  6. Photoshop和WPF双剑配合,打造炫酷个性的进度条控件

    现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...

  7. jQuery 制作逼真的日历翻转效果的倒计时

    在开发中,一些功能需要用到倒计时,例如最常见的活动开始.结束的倒计时.使用最流行的 JavaScript 库来制作这个效果很简单.下面就是一个 jQuery 制作的逼真的日历翻转效果的倒计时功能. 在 ...

  8. Scroll Depth – 衡量页面滚动的 Google 分析插件

    Scroll Depth 是一个小型的 Google Analytics(谷歌分析)插件,可以让你衡量用户在页面上滚动了多远.它可以监控 25%.50%.75% 和 100% 四个滚动点,并发送谷歌分 ...

  9. Ratatype - 在线打字教程,提高打字速度

    Ratatype 是一个在线的打字教程网站,帮助人们提高键盘输入速度.开始掌握你的技能,挑战你的朋友或得到一个打字的证书.如果打字慢会浪费你宝贵的时间.如果你的打字速度提高30%,您可以每天节省20分 ...

  10. Web前端开发工程师基本要求

    一位好的Web前端开发工程师在知识体系上既要有广度,又要有深度,所以很多大公司即使出高薪也很难招聘到理想的前端开发工程师.现在说的重点不在于讲解技术,而是更侧重于对技巧的讲解.技术非黑即白,只有对和错 ...