1 在List尾部插入数据时,数据量如果较小,两者的差别不大,linkedList速度比arrayList稍微快一点,这和自己定义的arrayList的初始容量有直接关联,当数据量较大时ArrayList比较快,因为ArrayList扩容是当前容量1.5倍,大容量扩一次就能提供很多空间,而LinkedList每次add时候会new Node,当数据量大时,new Node消耗的时间会让linkedList比arrayList慢很多。
2 在List首部插入数据时,LinkedList较快,因为LinkedList遍历插入位置花费时间很小,ArrayList需要将数组变更为新数组并进行重新排序,这个动作消耗的时间很长,相比而言,linkedList的速度会更快。
3 插入越往中间,LinkedList效率越低,因为它遍历获取插入位置是从两端往中间搜,index越往中间遍历越久,因此ArrayList的插入效率可能比LinkedList高。
4 插入位置越往后,ArrayList效率越高,因为数组需要复制后移的数据少了,那么System.arraycopy就快了。因此在首部插入数据LinkedList效率比ArrayList高,在尾部插入数据ArrayList效率比LinkedList高。
往尾部插入数据:
public static void main(String[] args) {
List<Integer> cargoNo = new ArrayList<>();
List<Integer> cargoNos = new LinkedList<>();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
cargoNo.add(i);
}
//cargoNo.get(3997979);
long endTime = System.currentTimeMillis();
System.out.println("arrayList所用时间为"+(endTime-startTime));
for (int i = 0; i < 10000000; i++) {
cargoNos.add(i);
}
//cargoNos.get(3997979);
long endTime1 = System.currentTimeMillis();
System.out.println("linkedList所用时间为"+(endTime1-endTime));
}
千万级别数据的情况下也是arrayList速度要比linkedList要快:
往首部插入数据:
public static void main(String[] args) {
List<Integer> cargoNo = new ArrayList<>();
List<Integer> cargoNos = new LinkedList<>();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
cargoNo.add(0,i);
}
//cargoNo.get(3997979);
long endTime = System.currentTimeMillis();
System.out.println("arrayList所用时间为"+(endTime-startTime)+"ms");
for (int i = 0; i < 1000000; i++) {
cargoNos.add(0,i);
}
//cargoNos.get(3997979);
long endTime1 = System.currentTimeMillis();
System.out.println("linkedList所用时间为"+(endTime1-endTime)+"ms");
}
往首都插入数据时,数据量大的情况下,ArrayList的非常慢的:
总结:
以下情况使用 ArrayList :
频繁访问列表中的某一个元素。
只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
你需要通过循环迭代来访问列表中的某些元素。
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。