菜鸟问题,怎么LinkedList比ArrayList添加元素还要慢啊??

liuchang537396 2014-07-30 03:14:50
不是说LinkedList添加删除元素比ArrayList开销小吗?? 怎么添加元素反而慢呢??

import java.util.ArrayList;
import java.util.LinkedList;


public class AddingGroups {

public static void main(String[] args) {
//新建一个LinkedList集合
LinkedList<Integer> linkedList = new LinkedList<>();
//新建一个ArrayList集合
ArrayList<Integer> arrayList = new ArrayList<>();
//记录linkedList添加开始时间
Long statTimeLink = System.currentTimeMillis();
//开始添加元素
for(int i = 0;i<1000000;i++){
linkedList.add(i);
}
//记录linkedList添加元素结束时间
Long endTimeLink = System.currentTimeMillis();

//计算linkedList添加用的时间
System.out.println("linkedList添加用的时间是"+(endTimeLink - statTimeLink)+"s");

//记录ArrayList添加开始时间
Long statTimeArray = System.currentTimeMillis();
//开始添加元素
for(int i = 0;i<1000000;i++){
arrayList.add(i);

}
//记录ArrayList添加结束时间
Long endTimeArray = System.currentTimeMillis();
//计算arrayList添加用的时间
System.out.println("ArrayList添加用的时间是"+(endTimeArray - statTimeArray)+"s");




}

}

运行结果:linkedList添加用的时间是1483s
ArrayList添加用的时间是437s
...全文
1659 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我是这么认为的:无序添加的时候,arraylist 通过索引找到要插入的位置,进行插入,然后数组插入位置后面的索引都要发生变化(数据量大的时候开销很大),而linkedlist不同,底层是链表,也就是一个指针指向前面的元素,一个指针指向后面的元素。插入的时候只需要改变两个指针,新增两个指针。你全部插入到最后面的话,arraylist相当于索引不需要变化了,就导致了arraylist插入比linkedlist快的结果。
qq_38814020 2018-05-21
  • 打赏
  • 举报
回复
不能顺序添加,你得插入添加。
qq_33669307 2018-05-20
  • 打赏
  • 举报
回复
666666
爱睡觉的阿狸 2016-12-18
  • 打赏
  • 举报
回复
慢是因为ArrayList的扩容,但ArrayList又不是每添加一个就扩容一次。
guzhoumingyue 2016-12-17
  • 打赏
  • 举报
回复
不错学习了,顶!!!
乔不思 2014-08-23
  • 打赏
  • 举报
回复
2.LinkList是链表,,, 链表的话那么 它的插入(给定一个位置)和删除 快, 数组的话,由于存在 下标,那么他的查询就快点。 就你这个题说的话,你每次都添加在 末尾位置,,,那么链表的话还有把整个链表遍历一遍达到末尾位置,才进行添加; 数组的话,由于存在索引值,所以直接就可以让索引值+1在赋值, 明显,数组的这种添加性能要优于 链表
乔不思 2014-08-23
  • 打赏
  • 举报
回复
直接从底层数据结构分析: 1,Arraylist是可变长的数组,
shixukai1986 2014-08-22
  • 打赏
  • 举报
回复
书上说的是算法的平均值
lousang123 2014-08-22
  • 打赏
  • 举报
回复
顺序的话arrayList肯定快,无序的话开销就会非常大
HighMore_g 2014-08-22
  • 打赏
  • 举报
回复
改是看源码的时候了,
rumlee 2014-08-05
  • 打赏
  • 举报
回复
最好的方式其实是看源码,当你把源码都吃透了之后,你就知道为什么了. 还有看看数据结构相关的知识。
vivianhai 2014-08-05
  • 打赏
  • 举报
回复
ArrayList的底层是数组,而LinkList的底层是链表;从ArrayList中随机删除一个对象,后面的数组排序就会朝前移位,这就是开销大的来处;而LinkList,用的是链表,随机删除某一个,就将删除前的一个直接链接删除后的一个,而不要进行移位
下一页天空 2014-08-03
  • 打赏
  • 举报
回复
学习了哈哈
kiyoki 2014-08-02
  • 打赏
  • 举报
回复
除非你拼命向头部添加且数据大,否则都是ArrayList快。 楼上就说得很详细了
vnvlyp 2014-08-02
  • 打赏
  • 举报
回复
这又是渣渣Java入门书干的好事 目测就是写一句LinkedList添加删除快,ArrayList访问快之类的话误导初学者 这样含糊其辞还不如不说 如果你想知道究竟他们两个在不同情况下谁快谁慢,那请直接看源码,源码看懂了你自然知道答案了,什么叫看懂了?就是当你意识到你对于这个问题写一篇专题文章都不一定讲得清的时候 如果你只是想知道写代码应该用哪个,那么99%的情况用ArrayList,还有1%的情况是: 1、超大List,超大指至少十几万个元素,并且还需要频繁添加删除,但不需要频繁访问 2、较大List,指至少几千个元素,需要频繁向Lis t很靠前的地方添加删除元素,但是很少需要访问List靠中间部分的元素 3、当你发现ArrayList比LinkedList耗时多一个数量级的时候
maxiaosaga 2014-08-01
  • 打赏
  • 举报
回复
java_haopeng 2014-07-31
  • 打赏
  • 举报
回复
真欢乐,又长知识又娱乐。
fishing999 2014-07-30
  • 打赏
  • 举报
回复
真欢乐,又长知识又娱乐。
honglei92 2014-07-30
  • 打赏
  • 举报
回复
我居然看不懂你们在说什么 看来我还是小白啊
jsshizhanab 2014-07-30
  • 打赏
  • 举报
回复
引用 5 楼 csucaicai 的回复:
[quote=引用 2 楼 magi1201 的回复:] 顺序存取,ArrayList 比较快;随机存取,LinkedList比较快。 楼主的示例中,顺序存取,把LinkedList当做ArrayList来用了,速度自然拼不过ArrayList了。
就是这样的问题,拿路虎跟卡车比载运量。。。。。[/quote]这个形容有点吊
加载更多回复(6)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧