知识大全 Java中ArrayList和LinkedList区别

Posted 元素

篇首语:只有上不去的天,没有过不去的山。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中ArrayList和LinkedList区别相关的知识,希望对你有一定的参考价值。

Java中ArrayList和LinkedList区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一般大家都知道ArrayList和LinkedList的大致区别

   ArrayList是实现了基于动态数组的数据结构 LinkedList基于链表的数据结构

   对于随机访问get和set ArrayList觉得优于LinkedList 因为LinkedList要移动指针

   对于新增和删除操作add和remove LinedList比较占优势 因为ArrayList要移动数据

  ArrayList和LinkedList是两个集合 类 用于存储一系列的对象引用(references) 例如我们可以用ArrayList来存储一系列的String或者Integer 那么 ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?

  一.时间复杂度

  首先一点关键的是 ArrayList的内部实现是基于基础的对象数组的 因此 它使用get方法访问列表中的任意一个元素时 (random access) 它的速度要比LinkedList快 LinkedList中的get方法是按照顺序从列表的一端开始检查 直到另外一端 对 LinkedList而言 访问列表中的某个指定元素没有更快的方法了

  假设我们有一个很大的列表 它里面的元素已经排好序了 这个列表可能是ArrayList类型 的也可能是LinkedList类型的 现在我们对这个列表来进行二分查找(binary search) 比较列表是ArrayList和LinkedList时的查询速度 看下面的程序

  Java代码

  package mangocity test;

  import java util LinkedList;

  import java util List;

  import java util Random;

  import java util ArrayList;

  import java util Arrays;

  import java util Collections;

  public class TestList

  public static final int N= ;

  public static List values;

  static

  Integer vals[]=new Integer[N];

  Random r=new Random();

  for(int i= currval= ;i<N;i++)

  vals=new Integer(currval);

  currval+=r nextInt( )+ ;

  

  values=Arrays asList(vals);

  

  static long timeList(List lst)

  long start=System currentTimeMillis();

  for(int i= ;i<N;i++)

  int index=Collections binarySearch(lst values get(i));

  if(index!=i)

  System out println( ***错误*** );

  

  return System currentTimeMillis() start;

  

  public static void main(String args[])

  System out println( ArrayList消耗时间 +timeList(new ArrayList(values)));

  System out println( LinkedList消耗时间 +timeList(new LinkedList(values)));

  

  

  我得到的输出 是 ArrayList消耗时间

  LinkedList消耗时间

  这个结果不是固定的 但是基本上ArrayList的 时间要明显小于LinkedList的时间 因此在这种情况下不宜用LinkedList 二分查找法使用的随机访问(random access)策略 而LinkedList是不支持快速的随机访问的 对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例 的 而相应的 在ArrayList中进行随机访问所消耗的时间是固定的

  这是否表明ArrayList总是比LinkedList性能要好呢?这并不一定 在某些情况 下LinkedList的表现要优于ArrayList 有些算法在LinkedList中实现时效率更高 比方说 利用 Collections reverse方法对列表进行反转时 其性能就要好些

  看这样一个例子 加入我们有一个列表 要对其进行大量的插入和删除操作 在这种情况下 LinkedList就是一个较好的选择 请看如下一个极端的例子 我们重复的在一个列表的开端插入一个元素

  Java代码

  package mangocity test;

  import java util *;

  public class ListDemo

  static final int N= ;

  static long timeList(List list)

  long start=System currentTimeMillis();

  Object o = new Object();

  for(int i= ;i<N;i++)

  list add( o);

  return System currentTimeMillis() start;

  

  public static void main(String[] args)

  System out println( ArrayList耗时 +timeList(new ArrayList()));

  System out println( LinkedList耗时 +timeList(new LinkedList()));

  

  

  这时我的输出结果是 ArrayList耗时

  LinkedList耗时

  这和前面一个例子的结果截然相反 当一个元素被加到ArrayList的最开端时 所有已经存在的元素都会后 移 这就意味着数据移动和复制上的开销 相反的 将一个元素加到LinkedList的最开端只是简单的未这个元素分配一个记录 然后调整两个连接 在 LinkedList的开端增加一个元素的开销是固定的 而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的

  二.空间复杂度

  在LinkedList中有一个私有的内部类 定义如下

  Java代码

  private static class Entry

  Object element;

  Entry next;

  Entry previous;

  

  每个Entry对象 reference列表中的一个元素 同时还有在LinkedList中它的上一个元素和下一个元素 一个有 个元素的LinkedList对象将 有 个链接在一起的Entry对象 每个对象都对应于列表中的一个元素 这样的话 在一个LinkedList结构中将有一个很大的空间开销 因为 它要存储这 个Entity对象的相关信息

  ArrayList使用一个内置的数组来存储元素 这个数组的起始容量是 当数组需要增长时 新的容量按 如下公式获得 新容量=(旧容量* )/ + 也就是说每一次容量大概会增长 % 这就意味着 如果你有一个包含大量元素的ArrayList对象 那么最终将有很大的空间会被浪费掉 这个浪费是由ArrayList的工作方式本身造成的 如果没有足够的空间来存放新的元素 数组将不得不被重新进行分 配以便能够增加新的元素 对数组进行重新分配 将会导致性能急剧下降 如果我们知道一个ArrayList将会有多少个元素 我们可以通过构造方法来指定 容量 我们还可以通过trimToSize方法在ArrayList分配完毕之后去掉浪费掉的空间

  三.总结

  ArrayList和LinkedList在性能上各 有优缺点 都有各自所适用的地方 总的说来可以描述如下

   .对ArrayList和LinkedList而言 在列表末尾增加一个元素所花的开销都是固定的 对 ArrayList而言 主要是在内部数组中增加一项 指向所添加的元素 偶尔可能会导致对数组重新进行分配 而对LinkedList而言 这个开销是 统一的 分配一个内部Entry对象

   .在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动 而在LinkedList的中间插入或删除一个元素的开销是固定的

   .LinkedList不 支持高效的随机元素访问

   .ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间 而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

cha138/Article/program/Java/hx/201311/26293

相关参考

知识大全 java高级技术总结 2

   ArrayList集合与HashSet的区别      Arraylist:add方法直接把所以元素加进

知识大全 Java线程安全和非线程安全

Java线程安全和非线程安全  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ArrayList和

知识大全 vb.net中应用ArrayList 实例

vb.net中应用ArrayList实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Arra

知识大全 修改ArrayList里面的内容

修改ArrayList里面的内容  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天学到了一个方

知识大全 ASP中的ArrayList类

ASP中的ArrayList类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用方法如下  程

知识大全 Vector还是ArrayList这是个问题

Vector还是ArrayList这是个问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  AP

知识大全 C# 中 List 用法

C#中List用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  List类是ArrayList

知识大全 在java的main方法中调用java和javac

  调用java  Runtimehello=RuntimegetRuntime();//Runtime构造函数私有只能通过这种方式获得实例  helloexec(cmd /cstartJa

知识大全 在JAVA中并行和并发机制的区别?

在JAVA中并行和并发机制的区别?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在JAVA中并行和并

知识大全 Java中数组的转型和范型

Java中数组的转型和范型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天写代码遇到一个奇怪