黑马程序员技术交流社区

标题: 有关数组 [打印本页]

作者: 杨雯雯    时间: 2012-12-20 13:50
标题: 有关数组
本帖最后由 杨雯雯 于 2012-12-24 14:42 编辑

插入数据时,ArrayList、LinkedList 谁速度较快?还有,它们插入数据的原理是什么?麻烦将的通俗易懂一点

作者: Spring up    时间: 2012-12-20 13:59
ArrayList:查表速度快,因为它的底层是数组结构
LinkedList :增删速度快,因为它的底层是链表结构
用法就是:看你用来是查看呢!还是增删!适当根据需求了
作者: 焦健    时间: 2012-12-20 14:08
ArrayList底层数据使用的是数组结构,可变数组延长是50%,

作者: Kevin123    时间: 2012-12-20 14:10
ArrayList使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢;
而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快;
作者: 焦健    时间: 2012-12-20 14:12
ArrayList底层数据使用的是数组结构,可变数组延长是50%,特点是:查询快,增删稍慢,线程不同步。
LinkedList底层使用的是链表数据结构,特点是:增删速度块,查询稍慢。
在毕老师的视频讲解里面他画出来数组结构和链表结构的表现形式,你可以仔细看一下。
作者: 王进亮    时间: 2012-12-20 17:10
如果有那么两全其美的方法的话ArrayList和LinkedList早就没人用了。

如果你的数据量小的话,比如数量不到几十万的话,根本就不用考虑性能问题,用起来没有任何区别。

特别大的数据量可以考虑用一个装着多个ArrayList的LinkedList,插入的时候只需要插入到一个比较小的ArrayList里,遍历的时候大部分时间都在分别的ArrayList里进行。

另一个叫作图书馆的方法是在生成ArrayList的时候预先留好一些空位以便以后插入,就好比图书馆的书架不总是满的一样。

如果你的数据没有顺序的话可以用ArrayList快速插入删除。首先因为没有顺序所以插入可以直接插到最后。而删除的时候把最后一个东西和要删除的东西对调,然后删除最后一个东西。
作者: 王小聪    时间: 2012-12-20 18:13
您好,插入数据的时候是LinkedList比较快。
解释:ArrayList是底层是数组,数组你明白的,查找很快,因为有索引啊,但是你要改动的话就很麻烦,也是因为索引。因为在堆区分配好的值与索引是在一起,他们是一体的。一个数组是大家都在一起
但是LinkedList底层是链表,链表就是在堆内存中有自己的空间,自己的空间的话那你想换的话就简单多了
作者: 王小聪    时间: 2012-12-20 18:14
您好,插入数据的时候是LinkedList比较快。
解释:ArrayList是底层是数组,数组你明白的,查找很快,因为有索引啊,但是你要改动的话就很麻烦,也是因为索引。因为在堆区分配好的值与索引是在一起,他们是一体的。一个数组是大家都在一起
但是LinkedList底层是链表,链表就是在堆内存中有自己的空间,自己的空间的话那你想换的话就简单多了
作者: 王小聪    时间: 2012-12-20 18:17
数组的比方:就是大家都在一个教室里的学生。学生就是数组里的数据,而所有的学生都在一个教室里,这是ArrayList
但是在这个楼里,一个学生一个教室的话那就是LinkedList。明白了吧?

作者: 杨雯雯    时间: 2012-12-20 18:46
王小聪 发表于 2012-12-20 18:17
数组的比方:就是大家都在一个教室里的学生。学生就是数组里的数据,而所有的学生都在一个教室里,这是Arra ...

你的回答很形象,明白了,谢谢
作者: 清水    时间: 2012-12-21 19:35
拿排队来打比方:
ArrayList就是,队伍中的每一个人都拿着一个有编了号的条子。叫到几号,几号出来(调用)。
但如过有人(A)要插入队伍中间,那么编号条子要加一个,给队伍最后面的人,队伍最后面的人把他原来的号给前面的一个人,以此类推,直到那个人想要插入的位置,原来在那个位置的人把他自己的号码给A
删除的时候你可以以理解。
如果B不排队了。要出来,那么,他把自己的编号条子给自己后面的人,后面的人再把自己的条子给在自己后面的人,以此类推,最后一个人拿到新的编号条子之后把自己的编号条子丢掉。

LinkedList
而链表就是排队的时候,没有条子,但大家都知道自己前面是谁(除了第一个人),并记住,如果你要插进去,就告诉你想插入的那的人,现在我在你前面了,你要记住我,同时你也要把原来在他前面的那个人记住,作为你前面的人。
如果你要离开队伍,就告诉你后面的人,现在你前面的人是在我前面的那个人,我走了。

这样的话,你就开一理解ArrayList和LinkedList的区别了。
作者: 黄锦成    时间: 2012-12-24 12:02
ArrayList底层数据结构是数组,这个查询很快,有索引
LinkedList 底层数据结构是链表,增删很快的




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