ListArrayListLinkedListvector简介与区别解读

上传人:碎****木 文档编号:220863305 上传时间:2021-12-09 格式:DOCX 页数:16 大小:55.09KB
返回 下载 相关 举报
ListArrayListLinkedListvector简介与区别解读_第1页
第1页 / 共16页
ListArrayListLinkedListvector简介与区别解读_第2页
第2页 / 共16页
ListArrayListLinkedListvector简介与区别解读_第3页
第3页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《ListArrayListLinkedListvector简介与区别解读》由会员分享,可在线阅读,更多相关《ListArrayListLinkedListvector简介与区别解读(16页珍藏版)》请在金锄头文库上搜索。

1、List ArrayList LinkedList vector 简介与区分ArrayList,LinkedList,Vestor 这三个类都实现了 java.util.List 接口,但它们有各自不同的特性,主要如下:ArrayList:底层用数组实现的 List特点:查询效率高,增删效率低 轻量级 线程担忧全LinkedList:底层用双向循环链表 实现的 List特点:查询效率低,增删效率高Vector: 底层用数组实现 List 接口的另一个类特点:重量级,占据更多的系统开销 线程平安一、同步性ArrayList,LinkedList 是不同步的,而Vestor 是同步的。所以假设不要

2、求线程平安的话,可以使用 ArrayList 或 LinkedList,可以节约为同步而消耗的开销。但在多线程的状况下,有时候就不得不使用 Vector 了。固然,也可以通过一些方法包装 ArrayList,LinkedList,使他们也到达同步,但效率可能会有所降低。二、数据增长从内部实现机制来讲ArrayList 和Vector 都是使用Objec 的数组形式来存储的。当你向这两种类型中增加元素的时候,假设元素的数目超出了内 部数组目前的长度它们都需要扩展内部数组的长度,Vector 缺省状况下自动增长原来一倍的数组长度,ArrayList 是原来的 50%,所以最终你获得 的这个集合所占

3、的空间总是比你实际需要的要大。所以假设你要在集合中保存大量的数据那么使用 Vector 有一些优势,由于你可以通过设置集合的初始化大小 来避开不必要的资源开销。三、检索、插入、删除对象的效率ArrayList 和 Vector 中,从指定的位置用index检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。 但是,假设在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中 n 代表集合中元素的个数,i 代表元素增加或移除元素的索引位 置。为什么会这样呢? 以为在进展上述操作的时候集合中第 i 和第 i 个元素之后的全部元素都要执行(n-i)个对

4、象的位移操作。LinkedList 中,在插入、删除集合中任何位置的元素所花费的时间都是一样的O(1),但它在索引一个元素的时候比较慢,为 O(i),其中 i 是索引的位置。一般大家都知道 ArrayList 和 LinkedList 的大致区分:1. ArrayList 是实现了基于动态数组的数据构造,LinkedList 基于链表的数据构造。2. 对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,由于LinkedList 要移动指针。3. 对于新增和删除操作 add 和 remove,LinedList 比较占优势,由于ArrayList 要移动数据。A

5、rrayList 和 LinkedList 是两个集合 类,用于存储一系列的对象引用(references)。例如我们可以用 ArrayList 来存储一系列的 String 或者Integer。那么 ArrayList 和 LinkedList 在性能上有什么差异呢?什么时候应当用 ArrayList 什么时候又该用 LinkedList 呢?一时间复 杂度首先一点关键的是,ArrayList 的内部实现是基于根底的对象数组的,因此,它使用 get 方法访问列表中的任意一个元素时 (random access),它的速度要比LinkedList 快。LinkedList 中的 get 方法是

6、依据挨次从列表的一端开头检查, 直到另外一端。对 LinkedList 而言,访问列表中的某个指定元素没有更快的方法了。假设我们有一个很大的列表,它里面的元素已经排好序了,这个列表可能是ArrayList 类型 的也可能是 LinkedList 类型的,现在我们对这个列表来进展二分查找(binary search),比较列表是 ArrayList 和 LinkedList 时的查询速度, 看下面的程序:Java 代码package com.mangocity.test; import java.util.LinkedList; import java.util.List; import jav

7、a.util.Random; import java.util.ArrayList; import java.util.Arrays;import java.util.Collections; public class TestList .public static final int N=50000;public static List values;static.Integer vals=new IntegerN; Random r=new Random();for(int i=0,currval=0;iN;i+). vals=new Integer(currval); currval+=

8、r.nextInt(100)+1;values=Arrays.asList(vals);static long timeList(List lst).long start=System.currentTimeMillis(); for(int i=0;iN;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

9、). System.out.println(“ArrayList 消耗时间:“+timeList(newArrayList(values);System.out.println(“LinkedList 消耗时间:“+timeList(new LinkedList(values);我得到的输出 是:ArrayList 消耗时间:15LinkedList 消耗时间:2596这个结果不是固定的,但是根本上 ArrayList 的 时间要明显小于 LinkedList 的时间。因此在这种状况下不宜用 LinkedList。二分查找法使用的随机访问(random access)策略,而 LinkedLi

10、st 是不支持快速的随机访问的。对一个LinkedList 做随机访问所消耗的时间与这个 list 的大小是成比例 的。而相应的,在 ArrayList 中进展随机访问所消耗的时间是固定的。这是否说明 ArrayList 总是比 LinkedList 性能要好呢?这并不肯定,在某些状况 下 LinkedList 的表现要优于 ArrayList,有些算法在 LinkedList 中实现时效率更高。比方说,利用 Collections.reverse 方法对列表进展反转时,其性能就要好些。看这样一个例子,参加我们有一个列表,要对其进展大量的插入和删除操作,在这种状况下 LinkedList 就是

11、一个较好的选择。请看如下一个极端的例子,我们重复的在一个列表的开端插入一个元素:Java 代码package com.mangocity.test;import java.util.*; public class ListDemo static final int N=50000;static long timeList(List list)long start=System.currentTimeMillis(); Object o = new Object();for(int i=0;iN;i+) list.add(0, o);return System.currentTimeMillis

12、()-start;public static void main(String args) System.out.println(“ArrayList 耗时:“+timeList(newArrayList();System.out.println(“LinkedList 耗时:“+timeList(newLinkedList();这时我的输出结果是:ArrayList 耗时:2463LinkedList 耗时:15这和前面一个例子的结果截然相反,当一个元素被加到 ArrayList 的最开端时, 全部已经存在的元素都会后 移,这就意味着数据移动和复制上的开销。相反的, 将一个元素加到 Link

13、edList 的最开端只是简洁的未这个元素安排一个记录,然后调整两个连接。在 LinkedList 的开端增加一个元素的开销是固定的,而在ArrayList 的开端增加一个元素的开销是与 ArrayList 的大小成比例的。二空间复 杂度在 LinkedList 中有一个私有的内部类,定义如下:Java 代码private static class Entry Object element; Entry next; Entry previous;每个 Entry 对象 reference 列表中的一个元素,同时还有在 LinkedList 中它的上一个元素和下一个元素。一个有 1000 个元素

14、的 LinkedList 对象将 有 1000 个链接在一起的 Entry 对象,每个对象都对应于列表中的一个元素。这样的话, 在一个 LinkedList 构造中将有一个很大的空间开销,由于 它要存储这 1000 个Entity 对象的相关信息。ArrayList 使用一个内置的数组来存储元素,这个数组的起始容量是 10.当数组需要增长时,新的容量按 如下公式获得:新容量=(旧容量*3)/2+1,也就是说每一次容量或许会增长 50%。这就意味着,假设你有一个包含大量元素的 ArrayList 对象, 那么最终将有很大的空间会被铺张掉,这个铺张是由 ArrayList 的工作方式本身造成的。假

15、设没有足够的空间来存放新的元素,数组将不得不被重新进展分 配以便能够增加新的元素。对数组进展重新安排,将会导致性能急剧下降。假设我们知道一个 ArrayList 将会有多少个元素,我们可以通过构造方法来指定容量。我们还可以通过 trimToSize 方法在 ArrayList 安排完毕之后去掉铺张掉的空间。三总结ArrayList 和 LinkedList 在性能上各 有优缺点,都有各自所适用的地方,总的说来可以描述如下:1. 对 ArrayList 和 LinkedList 而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList 而言,主要是在内部数组中增加一项,指向所添加的元素,间或可能会导致对数组重新进展安排;而对 LinkedList 而言,这个开销是统一的,安排一个内部 Entry 对象。2. 在 ArrayList 的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在 LinkedList 的中间插入或删除一个元素的开销是固定的。3. LinkedList 不

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号