Java ArrayList优于LinkedList的优点及其性能比较

Java ArrayList优于LinkedList的优点及其性能比较,java,performance,arraylist,linked-list,Java,Performance,Arraylist,Linked List,最近我一直在寻找Java中的LinkedList。经过一些研究,我发现使用LinkedList而不是ArrayList的主要好处是,在包含大量数据的列表中,在数组中间删除/添加元素时速度更快。因此,使用ArrayList而不是LinkedList有什么好处 为了比较,我编写了这个简单的程序来比较LinkedList和ArrayList之间的运行速度。该程序的概念是,它创建一个长度为n的整数数组,并用从Integer.MIN\u VALUE到Integer.MAX\u VALUE的随机整数填充该数

最近我一直在寻找Java中的LinkedList。经过一些研究,我发现使用LinkedList而不是ArrayList的主要好处是,在包含大量数据的列表中,在数组中间删除/添加元素时速度更快。因此,使用ArrayList而不是LinkedList有什么好处

为了比较,我编写了这个简单的程序来比较LinkedList和ArrayList之间的运行速度。该程序的概念是,它创建一个长度为n的整数数组,并用从
Integer.MIN\u VALUE
Integer.MAX\u VALUE
的随机整数填充该数组

然后,它创建另一个数组,即第一个数组元素的x%。例如,如果第一个数组是
[1,2,3,4,5,6,7,8,9,10]
,那么第二个数组,如果x设置为50%,可能是
[2,4,5,9,10]
。这将生成一个包含原始数组开始、中间和结尾的随机元素的数组

不计算创建这些阵列期间经过的运行时间。然后,程序创建一个LinkedList,将第一个数组中的所有元素添加到此列表中,并从此列表中删除第二个数组中的元素。我重复这个过程y次,并使用
System.nanoTime()
计算平均运行时间

我知道我的代码远未优化,但由于LinkedList和ArrayList的代码完全相同,因此只需更改正在创建的列表的类型,而不是在初始化时预先设置列表的大小,结果应该不会受到影响,对吗?例如,如果我的错误代码使其运行速度降低了400%,因为两者都使用相同的代码,那么结果应该不会受到任何影响,因为理论上,两者都会降低400%

我发现,ArrayList平均比LinkedList快360%
,至少在使用10万个整数数组并运行10次,同时删除45%的元素时是这样

通过阅读和StackOverflow文章比较ArrayList和LinkedList的性能,我了解到这是因为LinkedList为每个节点分配了更多内存(ArrayList上为24字节,而ArrayList上为4字节)。虽然从理论上讲,LinkedList在数组元素中间添加/删除元素时速度更快,平均只需要O(n/4)个步骤,而列表需要O(n/2),但事实上——至少在我的测试和在上面链接的帖子中执行的测试中——这似乎不是真的。如果是这样,那么问题就反过来了:使用LinkedList而不是ArrayList有什么好处?只能使用
list.iterator()

下面是我得到的确切结果和我用来得到它们的代码:

It took 53079,970300 ms with LinkedList to run 10 times with an array of 100000 integers removing 45 percent of the elements
The average run time for LinkedList was 5307,997030 ms
It took 14344,833900 ms with normal List to run 10 times with an array of 100000 integers removing 45 percent of the elements
The average run time for normal List was 1434,483390 ms
import java.util.ArrayList;
导入java.util.array;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.concurrent.ThreadLocalRandom;
公共类链接列表{
公共静态void main(字符串[]args){
int timesToRun=10;
int percentageToRemove=45;
int[]arr=getRandomArray(100_000);
int[]integersToRemoveArr=getIntegersToRemoveArr(percentageToRemove,arr);
长延时=0升;
长启动时间;
长时间;
//链接列表
startTime=System.nanoTime();
对于(int i=0;i100 | |移动百分比<0){
返回新的int[]{};
}
List indexesToRemove=new ArrayList();
而(indexesToRemove.size()<(originalArray.length*(percentageToRemove)/100F)){
int x=ThreadLocalRandom.current().nextInt(0,originalArray.length-1);
indexesToRemove.add(originalArray[x]);
}
int[]arr=new int[indexesToRemove.size()];
对于(int i=0;i