ArrayList和LinkedList的区别

作者&投稿:勤养 (若有异议请与网页底部的电邮联系)
ArrayList和LinkedList的区别~

ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
LinkedList链表由一系列表项连接而成。一个表项总是包含3个部分:元素内容,前驱表和后驱表,如图所示:

在下图展示了一个包含3个元素的LinkedList的各个表项间的连接关系。在JDK的实现中,无论LikedList是否为空,链表内部都有一个header表项,它既表示链表的开始,也表示链表的结尾。表项header的后驱表项便是链表中第一个元素,表项header的前驱表项便是链表中最后一个元素。

拓展资料
ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。
List 接口的大小可变数组的实现,位于API文档的java.util.ArrayList。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。
参考资料:百度百科-ArrayList词条

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

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

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

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

可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。 这一点我做了实验。在分别有200000条“记录”的ArrayList和LinkedList的首位插入20000条数据,LinkedList耗时约是ArrayList的20分之1。
for(int m=0;m<20000;m++){
linkedlist.add(m,null); //当在200000条数据之前插入20000条数据时,LinkedList只用了1125多ms.这就是LinkedList的优势所在
}
long time4 = new Dte().getTime();
System.out.print("batch linkedlist add:");
System.out.println(time4 - time3);
for(int n=0;n<20000;n++){
arraylist.add(n, null); //当在200000条数据之前插入20000条数据时,ArrayList用了18375多ms.时间花费是arraylist的近20倍(视测试时机器性能)
}
long time5 = new Date().getTime();
System.out.print("batch arraylist add:");
System.out.println(time5 - time4);

4.查找操作indexOf,lastIndexOf,contains等,两者差不多。
5.随机查找指定节点的操作get,ArrayList速度要快于LinkedList.
这里只是理论上分析,事实上也不一定,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。我做过一个插入和删除200000条数据的试验。
long time1 = new Date().getTime();
String s1 = (String) linkedlist.get(100000);// 总记录200000,linkedlist加载第100000条数据耗时15~32ms不等
long time2 = new Date().getTime();
System.out.println(time2 - time1);
String s2 = (String) arraylist.get(100000);// 总记录200000,linkedlist加载第100000条数据耗时0ms
long time3 = new Date().getTime();
System.out.println(time3 - time2);

/*分别insert200000条数据到linkedlist和arraylist
*由于是在末尾插入数据,arraylist的速度比linkedlist的速度反而要快
*/
public static void insertList(LinkedList linklist, ArrayList arraylist) {
long time1 = new Date().getTime();
System.out.println(time1);
for (int i = 0; i < 200000; i++) {
linklist.add(i, "linklist" + i);
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
for (int j = 0; j < 200000; j++) {
arraylist.add(j, "arraylist" + j);
}
long time3 = new Date().getTime();
System.out.println(time3 - time2);
}

/*delete linkedlist和arraylist中的200000条数据
*由于是在末尾删除数据,arraylist的速度比linkedlist的速度反而要快
*/
public static void deleteList(LinkedList linklist, ArrayList arraylist) {
long time1 = new Date().getTime();
System.out.println(time1);
for (int i = 199999; i >= 0; i--) {
linklist.remove(i);
}
long time2 = new Date().getTime();
System.out.println(time2 - time1);
for (int j = 199999; j >= 0; j--) {
arraylist.remove(j);
}
long time3 = new Date().getTime();
System.out.println(time3 - time2);
}

public static void main(String args[]) {
LinkedList linkedlist = new LinkedList();
ArrayList arraylist = new ArrayList();
insertList(linkedlist, arraylist);

//以下代码省略
插入:
LinkedList 578ms
ArrayList 437ms
删除:
LinkedList 31ms
ArrayList 16ms

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

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

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



Java中ArrayList和LinkedList区别

ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

上代码:

1     static final int N=50000;
2     static long timeList(List list){
3         long start=System.currentTimeMillis();
4         Object o = new Object();
5         for(int i=0;i<N;i++) {
6             list.add(0, o);
7         }
8         return System.currentTimeMillis()-start;
9     }
10     static long readList(List list){
11         long start=System.currentTimeMillis();
12         for(int i=0,j=list.size();i<j;i++){
13
14         }
15         return System.currentTimeMillis()-start;
16     }
17
18     static List addList(List list){
19         Object o = new Object();
20         for(int i=0;i<N;i++) {
21             list.add(0, o);
22         }
23         return list;
24     }
25     public static void main(String[] args) {
26         System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList()));
27         System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList()));
28
29         List list1=addList(new ArrayList<>());
30         List list2=addList(new LinkedList<>());
31         System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1));
32         System.out.println("LinkedList查找"+N+"条耗时:"+timeList(list2));
33     }

当我们在集合中装5万条数据,测试运行结果如下:

显然我们可以看出ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。



ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始

Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。

第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。

关于Properties
有时侯,你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法,但Java提供了另外一种方法。

Java.util.Properties类是Hashtable的一个子类,设计用于String keys和values。Properties对象的用法同Hashtable的用法相象,但是类增加了两个节省时间的方法,你应该知道。

Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反,用来读取文件,并设定Properties对象来包含keys和values。

注意,因为Properties扩展了Hashtable,你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外,如果你将store()用于一个不包含String对象的Properties对象,store()将失败。作为put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。


数组ArrayList和List之间的主要区别是什么?
【答案】:数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List的容量可根据需要自动扩充、修改、删除或插入数据。数组可以具有多个维度,而 ArrayList或 List< T> 始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组的性能优于 ArrayList的...

arraylist默认长度和扩容
1. 数组列表(ArrayList)的默认长度是10。2. 当数组列表中的元素数量超过其当前长度时,它会自动扩容以容纳更多元素。3. 扩容时,数组列表会创建一个新的、更大的数组,并将现有元素复制到这个新数组中。4. 默认情况下,扩容后的数组长度是原数组长度的1.5倍,但这个比例是可以配置的。

arraylist和数组有什么区别
两者区别在于动态扩展性、类型安全性不同。1、动态扩展性:数组在创建时需要指定其长度,并且一旦初始化后,长度是固定的,需要改变数组的大小,则必须创建一个新的数组,并将原有数组中的元素复制过来。ArrayList是可动态扩容的容器,当添加更多的元素并且当前容量不足以容纳时,会自动增大内部数组的大小。

ArrayList 和LinkedList各自的特点是什么?
1、ArrayList:动态数组。用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。2、LinkedList:双向列表。列表中的每个节点都包含了对前一个和后一个元素的引用。List 接口的大小可变数组的实现,位于API文档的java.util.ArrayList...

arraylist和list的区别
1、ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除。2、List泛型的...

ArrayList和LinkedList的区别
一般大家都知道ArrayList和LinkedList的大致区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。这一点要看实际情况的...

arraylist和linkedlist的区别
一、性质不同 1、arraylist:ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本。2、linkedlist:LinkedList 是一个继承于AbstractSequentialList的双向链表。二、作用不同 1、arraylist:提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。2、linkedlist:...

ArrayList和Vector的区别
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程...

ArrayLists和LinkedList的区别,下述说法正确的有
ArrayLists和LinkedList的区别,下述说法正确的有?A. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。B. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。C. 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。D. ArrayList的...

arraylist 和 linkedlist 的区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度...

云城区13135629310: ArrayList和LinkedList的区别
幸蒋延诺: 一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针. 3.对于新增和删除操作add...

云城区13135629310: LinkedList和ArrayList的区别 -
幸蒋延诺: ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下: 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的.对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元...

云城区13135629310: ArrayList和LinkedList的区别 -
幸蒋延诺: ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要...

云城区13135629310: arraylist和linklist的区别 -
幸蒋延诺: 1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要...

云城区13135629310: arraylist和linkedlist的区别和使用场景 -
幸蒋延诺: 1、ArrayList是基于数组实现的,其构造函数为:private transient Object[] elementData;private int size;ArryList初始化时,elementData数组大小默认为10;每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会...

云城区13135629310: 根据你的理解,请说明一下ArrayList和LinkedList的区别 -
幸蒋延诺: ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用.LinkedList的优势在于在中间位置插入和删除操作,速度是最快的,O(1),而ArrayList是O(n-i)的.大道理请参看: LinkedList类 LinkedList实现了List接口,允许...

云城区13135629310: ArrayList和LinkedList底层实现的区别 -
幸蒋延诺: ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删.ArrayList与LinkList两者的区别:ArrayList是基于索引的数据接口,它的底层是数组.它可以以O(1)时间复...

云城区13135629310: ArrayList 和LinkdList的区别是什么?
幸蒋延诺: ArrayList 实现List接口 ,随着向 ArrayList 中不断添加元素,其容量也自动增长 对于处理一列数据项,Java提供了两个类ArrayList和LinkedList, ArrayList的内部实现是基于内部数组Object[], 所以从概念上讲,它更象数组,但LinkedList的内部实...

云城区13135629310: ArrayList和LinkedList都是线程安全的吗? -
幸蒋延诺: 都是线程安全的. ArrayList和LinkedList的区别及其优缺点 ArrayList和LinkedList的大致区别: 1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为...

云城区13135629310: ArrayList与LinkedList之间的联系 -
幸蒋延诺: ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网