A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李蛟龙 中级黑马   /  2012-5-5 16:03  /  3047 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两者的区别,一定附带原因

11 个回复

倒序浏览
一个是链表,一个是数组
LinkedList插入删除比较快!分散空间!
ArrayList因为是有序的(下标),查找比较快!连续空间!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

ArrayList和LinkedList本质上的区别就是数组和列表这两种数据结构的区别。
ArrayList和LinkedList都是是两个实现类,他们实现的方式不一样,其实LinkedList才是真正的链表,而ArrayList是用数组实现的,它不是真正的链表,在初始化的时候它先对数组设置一个初始容量,当数组空间不够的时候,它会重新构建一个容量更大的数组,然后把先前的元素拷贝进去。
ArrayList
优点:适合随机查询
缺点:数量事先定好,只能用于小容量

LinkList
优点:适合在中间插入和删除值,数量可以无限增长
缺点:不适合用get方法随机取值(因为它总是从第一个值开始找)

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
ArrayList底层使用的是数组结构,对数据的查询很快,而对数据的增删稍慢。
LinkedList底层使用的是链表结构,对数据的增删很快,而对数据的查询稍慢。
原因:因为数组结构中每个元素都是有角标的,只要遍历角标,查询速度是很快的。但如果要增删元素,增删点之后的元素的角标都要调整,增删点越靠前,数组越长,增删越慢。而链表结构中,每一个节点(元素)中都含有下一个节点的引用(就像一根链条一样),如果查询元素,要从一次判断每个节点中是否包含指定元素,效率低。在链表中增删一个节点,只需将一处的节点连接断开即可,其他节点的位置和内容不变,效率很高。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
1   ArrayList  底层采用数组实现,当使用不带参数的构造方法生成 ArrayList  对象时,实际上会在底层生成一个长度为10 的Object 类型数组 ,如果增加的元素个数超过了10 个,那么ArrayList 底层会新生成一个数组,长度为原数组的 1.5  倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。
2  当向ArrayList 添加一个对象时,实际上就是将该对象放置到了ArrayList 底层所维护的数组当中;当向LinkedList 中添加一个对象时,实际上LinkedList  内部会生成一个Entry 对象,该Entry 对象的结构为:
Entry
{
    Entry previous;
    Object element;
    Entry next;
}
其中的 Object  类型的元素 element  就是我们向 LinkedList  中所添加的元素,然后Entry 又构造好了向前与向后的引用previous、next,最后将生成的这个Entry 对象加入到了链表当中。换句话说,LinkedList 中所维护的是一个个的Entry 对象。
3   关于ArrayList 与LinkedList 的比较分析
  a   ArrayList 底层采用数组实现,LinkedList 底层采用双向链表实现。
  b   当执行插入或者删除操作时,采用LinkedList 比较好。
  c   当执行搜索操作时,采用ArrayList  比较好。
回复 使用道具 举报
区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据.
使用:
1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的.对ArrayList而言,是在内部数组中增加一项,指向所添加的元素,可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象.
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的.
3.LinkedList不支持高效的随机元素访问.
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间(当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了).
回复 使用道具 举报
哦。。。。。 啦
回复 使用道具 举报
谭景宾 发表于 2012-5-5 16:18
一个是链表,一个是数组
LinkedList插入删除比较快!分散空间!
ArrayList因为是有序的(下标),查找比较快! ...

为什么不给提问题的人加技术分呢
回复 使用道具 举报
ArrayList 是由大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。每个ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。底层为数组数据结构,就决定了ArrayList类的查找速度快,因为可以依赖数组下标来查找。
但是在数组中的增删元素是相当麻烦的一件事,因为数组增删元素要移动大量元素的位置(前移或后移),所以说相对而言ArrayList的增删速度较慢。

LinkedList类是运用双向循环链表来实现的,读者可以研究源代码验证。双循环链表的数据结构决定了,LinkedList的查询速度慢,当是另一方面,双循环链表的数据结构为LinkedList
提供了方便快捷的增删元素操作,因为增删不需要移动元素,只需改变元素指向即可。
回复 使用道具 举报
Collection  (add(),remove(),contains(),clear(),iterator())
        |--List:元素是有序的,同时元素可以重复。因为该集合体系有索引。可以同时存储多个"张三"。
                |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
                |--LinkedList:底层使用的是链表数据结构。特点就是:增删的速度很快,查询的速度慢。
                |--Vector:底层是数组数据结构。特点:线程同步。增删查询速度慢,被ArrayList替代。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马