Java 在随机索引中插入项目时ArrayList与LinkedList?

Java 在随机索引中插入项目时ArrayList与LinkedList?,java,performance,arraylist,linked-list,Java,Performance,Arraylist,Linked List,因此,我偶然发现了这段代码,特别想知道为什么java.util.ArrayList比java.util.LinkedList要快得多 代码所做的是创建一个数组和链表,并为每个数组和链表提供一个元素。addMoreItems(List vals)将为两个数组运行,并在数组中的某个随机索引处为每个数组插入一个随机值。它将添加到每个数组中的值的数量由用户的输入决定 private static int amount=0; 公共静态void main(字符串[]args){ 扫描仪扫描=新扫描仪(Sys

因此,我偶然发现了这段代码,特别想知道为什么
java.util.ArrayList
java.util.LinkedList
要快得多

代码所做的是创建一个数组和链表,并为每个数组和链表提供一个元素。
addMoreItems(List vals)
将为两个数组运行,并在数组中的某个随机索引处为每个数组插入一个随机值。它将添加到每个数组中的值的数量由用户的输入决定

private static int amount=0;
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
System.out.print(“输入要添加的元素数量:”);
金额=scan.nextInt();
LinkedList linked=新建LinkedList();
ArrayList数组=新的ArrayList();
已链接。添加(0);
数组。添加(0);
//基准链表速度
长启动=System.nanoTime();
添加更多项目(链接);
long end=System.nanoTime()-开始;
//基准阵列列表速度
long start2=System.nanoTime();
addMoreItems(数组);
long-end2=System.nanoTime()-start2;
System.out.println(“链表take:+(end/1000000.0)+“ms”);
System.out.println(“数组列表:”+(end2/1000000.0)+“ms”);
}
公共静态无效addMoreItems(列表VAL){
随机r=新随机();
对于(int i=0;i
因此,从根本上讲,人们会认为
addMoreItems()
函数返回两种列表类型所需的时间相同(可能
LinkedList
会稍微快一点)。然而,实际结果似乎表明无论添加多少元素(),ArrayList
都比链表快得多

无论如何,我的猜测是,这可能与缓存有关,
LinkedList
将为插入的每个元素分配内存,而
ArrayList
将分配内存块以减少分配数量


为什么
ArrayList
更快?

您的期望不正确。明确地说(在第1部分中)

add
操作以摊余固定时间运行,即添加n个元素需要O(n)个时间。所有其他操作都在线性时间内运行(粗略地说)
LinkedList实现相比,常数因子较低。

由于常量因子较高,
LinkedList
上的每个
add
操作都比
ArrayList
上的稍慢,因此您应该期望
ArrayList
更快


1为强调添加了粗体。

对于LinkedList,节点的访问时间在最坏情况下为O(n)。这是因为如果要访问链接列表的第4个节点,需要从头部迭代到该特定节点

ArrayList是数组和列表的组合。它具有索引节点的优点,并且能够在需要时添加更多的添加。在<强> ARAYLIST中,您可以在固定时间访问特定节点,O(1),不需要重复关于DUPE:在中间或随机索引中插入并不重要,两种方法都以无效的方式使用LL。LinkedList的最佳情况是在列表开头附近添加。ArrayList的最佳情况是在末尾附近添加(尽管如果它位于两者之间的任何位置,则这一点无关紧要—通过调用本机
系统将元素复制到新数组。arraycopy()
非常快,即使在大型数组上也是如此)。如果你根据这一点对测试进行偏差,LinkedList实际上会胜出。