前几天我们了解到Collection接口与List接口,如果要实现它们还是特别的繁琐,所以我们今天介绍List ADT的两种流行的实现方式:
ArrayList类提供了List ADT的一种可增长的数组的实现,使用ArrayList的优点在于,对与get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵。
LinkedList类提供了List ADT的双链实现的,使用优点在于,新项的插入和现有项的删除都开销很小。所以,LimkedList提供了方法addFirst和removeFirst等有效的方法添加与删除。
这么说,大家可能还不相信时间开销的是不是真的,接下来我通过代码测试,来展现结果:!
package List版本;
import java.util.ArrayList;
import java.util.LinkedList;
public class example_02 {
public static void main(String[] args) throws Exception{
long total1 = 0;
long total2 = 0;
System.out.println("测试ArrayList");
long array_start1 = System.currentTimeMillis();
ArrayList arrayList = new ArrayList();
arrayList = add(arrayList,99999);
long array_end1 = System.currentTimeMillis();
System.out.println("添加元素,一共用时间:"+(array_end1-array_start1)+"ms");
long array_start2 = System.currentTimeMillis();
total1 = sum(arrayList);
long array_end2 = System.currentTimeMillis();
System.out.println("遍历元素,一共用时间:"+(array_end2-array_start2)+"ms"+"共计元素值总和:"+total1);
long array_start3 = System.currentTimeMillis();
arrayList = insert(arrayList,3,99999);
long array_end3 = System.currentTimeMillis();
System.out.println("插入元素,一共用时间:"+(array_end3-array_start3)+"ms");
/**
*
*/
System.out.println("测试LinkedList");
long linked_start1 = System.currentTimeMillis();
LinkedList linkedList = new LinkedList();
linkedList = add(linkedList,99999);
long linked_end1 = System.currentTimeMillis();
System.out.println("添加元素,一共用时间:"+(linked_end1-linked_start1)+"ms");
long linked_start2 = System.currentTimeMillis();
total2 = print(linkedList);
long linked_end2 = System.currentTimeMillis();
System.out.println("遍历元素,一共用时间:"+(linked_end2-linked_start2)+"ms"+"共计元素值总和:"+total2);
long linked_start3 = System.currentTimeMillis();
linkedList = insert(linkedList,3,99999);
long linked_end3 = System.currentTimeMillis();
System.out.println("插入元素,一共用时间:"+(linked_end3-linked_start3)+"ms");
}
public static ArrayList add(ArrayList a ,long n){
for(long i=0 ; i<n ; i++){
a.add(i);
}
return a;
}
public static LinkedList add(LinkedList l , long n){
for(long i=0 ; i<n ; i++){
l.add(i);
}
return l;
}
public static long sum(ArrayList a){
long s = 0 ;
long t ;
for(int i = 0 ; i < a.size() ; i++){
t = (long)a.get(i);
s = s + t ;
}
return s;
}
public static long print(LinkedList l){
long s = 0 ;
long t ;
for(int i = 0 ; i < l.size() ; i++){
t = (long)l.get(i);
s = s + t ;
}
return s;
}
public static ArrayList insert(ArrayList a,int index , int sum){
for(int i = 0 ; i < sum ; i++){
a.add(index,i);
}
return a;
}
public static LinkedList insert(LinkedList l , int index , int sum){
for(int i=0 ; i<sum ; i++){
l.add(index,i);
}
return l;
}
}
下面这个是,展现这次测试的结果:,很显然,在两者进行初始化写入数据的时候,不分伯仲;在获取数据的时候,ArrayList类的时间开销获胜;在插入数据的时候,LinkedList类的时间开销获胜。

本文详细比较了ArrayList和LinkedList在Java中作为List ADT实现的性能差异,通过实际测试展示了在添加、获取和插入操作中的时间开销,揭示了两者在不同场景下的适用性。
1969

被折叠的 条评论
为什么被折叠?



