java – 哪一个运行得更快,ArrayList或LinkedList?

前端之家收集整理的这篇文章主要介绍了java – 哪一个运行得更快,ArrayList或LinkedList?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> When to use LinkedList over ArrayList?30个
> Performance differences between ArrayList and LinkedList9个
List li = new LinkedList();

for (int i = 0; i < 100; i++) {
    li.add(i);
}

long start1 = System.nanoTime();
li.get(57);

long end1 = System.nanoTime();
long diff1 = end1-start1;

System.out.println("Time taken by LinkedList = "+diff1);

List al = new ArrayList();
for (int i = 0; i < 100; i++) {
    al.add(i);
}

我在两个列表上执行了什么操作,当我打印出时间时,ArrayList总是比LinkedList运行得更快.
有人可以解释一下表现更好的时间吗?
还要让我知道代码中是否有错误.谢谢!

解决方法

如果您必须执行大量的插入和不频繁的查找,请使用LinkedList.如果执行查询比插入更多,请使用ArrayList.

原因如下 – ArrayList由具有初始容量的数组支持.因此,如果您将项目插入列表中,则必须重新调整其阵列容量以适应新插入的项目,如果执行索引特征插入,则还可能需要移动现有项目.另一方面,LinkedList由链表支持,其中创建一个项目始终在一个恒定的时间内执行 – 创建一个项目并将其分配到列表的末尾.这里没有重新调整.

现在要从ArrayList获取一个项目,它总是需要一个固定的时间,因为它可以很容易地在一个恒定的时间内对背景数组进行索引.但是从LinkedList中获取项目可能会导致您遍历整个链接列表以查找项目节点.因此,在这种情况下,它的性能要低于ArrayList.

从上面的讨论中可以看出,当你有更多的插入时,LinkedList总是会优于ArrayList,因为后者的内部调整大小与插入相关联,而前者没有.另一方面,如果您有不频繁的插入和频繁查找,ArrayList总是会优于LinkedList,因为后者您可能必须遍历整个链接列表结构才能找到所需的项目,而前者可以快速找到您的项目数组索引在恒定时间.

当您处理大量项目(例如数千个项目)时,上述所有效果都将可见并影响您的应用程序的性能.对于较少的项目,性能差异不太明显.

现在,关于你的代码,你有一些严重的问题.对于起动器,您使用的是一种原始类型,因为您失去了仿制药所提供的所有类型的安全性,这是不好的.编写新代码时,应始终使用Collection API的通用版本.所以,改变你的代码如下 –

List<Integer> li = new LinkedList<Integer>();
for (int i = 0; i < 100; i++) {
    li.add(i);
}

long start1 = System.nanoTime();
li.get(57);

long end1 = System.nanoTime();
long diff1 = end1 - start1;

System.out.println("Time taken by LinkedList = "+diff1);

List<Integer> al = new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
    al.add(i);
}

请参见Effective Java项目23:不要在新代码中使用原始类型进行详细说明.

编辑

评论中的讨论中可以看出,如果您需要在列表中间或随机位置插入元素,则ArrayList在性能方面优于LinkedList,因为前者将使用memcpy来移动元素非常快,后者必须遍历到所需的索引才能正确插入新元素,这是较慢的.所以对于随机插入,ArrayList也胜过LinkedList.唯一的情况是LinkedList优于ArrayList,如果您只插入到列表的末尾,并且有很多这些插入.

原文链接:https://www.f2er.com/java/122538.html

猜你在找的Java相关文章