黑马程序员技术交流社区

标题: ArrayList和LinkedList有什么区别?分别是什么时候用的? [打印本页]

作者: 李红亮    时间: 2013-12-16 21:55
标题: ArrayList和LinkedList有什么区别?分别是什么时候用的?
本帖最后由 李红亮 于 2013-12-16 23:01 编辑

ArrayList和LinkedList有什么区别?分别是什么时候用的?可以相互取代吗?

作者: 郭涛    时间: 2013-12-16 22:11
ArrayList:底层数据结构是数组结构,线程不安全。所以ArrayList的出现替代了Vector,但是查询的速度很快,增加和删除非常慢。这个是因为ArrayList的增加和删除需要新建立一个数组去实现,就把定义一个新集合,把要增加的元素添加在新集合相应的位置以后,再把原来的旧集合内的元素复制过来,然后再返回新集合的地址,删除和添加的步骤差不多。
LinkedList:底层结构是链表数据结构,线程不安全的,同时对元素的增删操作效率很高。LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引  但是缺点就是查找非常麻烦 要丛第一个索引开始然后依次向后去查找,直到找到所查找的元素。
使用:
如果查找比较多,建议用ArrayList。
如果增删比较多,建议用LinkedList。
作者: kongling    时间: 2013-12-16 22:33
ArrayList底层的实现是数组,所以用下标访问的速度比较快,但是插入和删除元素,会有移动元素的开销,所以速度比LinkedList差。
LikedList底层是链表实现的,所以插入和删除元素时间复杂度较LinkedList好,但是随即访问需要遍历元素,所以效率比ArrayList差。
一般情况下,用ArrayList就可以了,如果涉及到频繁的插入和删除元素,这个时候考虑使用LinkedList,另外Java里面的Queue和Stack也是依赖LinkedList实现的。
作者: ISAI    时间: 2013-12-16 22:37
--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将元数组元素复制到新数组)。线程同步的。增删和查询都慢!
--ArrayList:也是数组结构,也是长度可变的。线程不同步的,替代了Vector。增删速度不快。查询速度很快。
--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。


ArrayList: 数组结构。看到数组,就知道查询快,看到list,就知道可以重复。可以增删改查。

LinkedList: 链表结构,增删快。xxxFirst xxxLast. xxx:add get remove
作者: 末末    时间: 2013-12-16 22:51
  ArrayList:底层的数据结构是数组,查询较快,增删较慢,默认的长度是10,超过10了就会new一个新的数组,长度50%延长,把原来数组中的元素复制到新数组中去,再把新元素添加到后面去
     LinkedList:底层的数据结构是链表结构,增删较快,查询较慢

作者: 恨死我了    时间: 2013-12-16 22:51
ArrayList底层的实现是数组,所以用下标访问的速度比较快,但是插入和删除元素,会有移动元素的开销,所以速度比LinkedList差。
LikedList底层是链表实现的,所以插入和删除元素时间复杂度较LinkedList好,但是随即访问需要遍历元素,所以效率比ArrayList差。
一般情况下,用ArrayList就可以了,如果涉及到频繁的插入和删除元素,这个时候考虑使用LinkedList.
作者: 纷飞尽    时间: 2013-12-16 22:57
  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
     3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

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

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

4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
作者: 李红亮    时间: 2013-12-16 23:00
郭涛 发表于 2013-12-16 22:11
ArrayList:底层数据结构是数组结构,线程不安全。所以ArrayList的出现替代了Vector,但是查询的速度很快, ...

说的很具体,谢谢
作者: 李红亮    时间: 2013-12-16 23:02
纷飞尽 发表于 2013-12-16 22:57
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
     2.对于随机访问get ...

谢谢你的热心回答(*^__^*)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2