ArrayList数组 物理结构连续,并且有自己的下标,因而访问起来效率高,但也因其物理结构连续,插入元素时插入位置后的元素都要后移一位,删除同理,故而添加/删除元素的效率不高
LinkedList双向链表,列表中的每个节点都包含了对前一个和后一个元素的引用.访问效率低于ArrayList数组,但添加/删除元素只需要改变前后两个节点,故添加/删除元素的效率高于ArrayList数组.
—补充:LinkedList双向链表的特点是端口和尾端都能进能出,所以从端口和尾端无论是访问还是添加/删除,效率都比从中间开始的高
总结:查询用ArrayList,添加/删除用LinkedList
代码验证:
public class Num1ArrayVSLinked {
public static void main(String[] args) {
//ArrayList数组和LinkedList双向链表效率问题的比较--两个方面:取元素,插入元素
//1.取元素
ArrayList<String> arr = new ArrayList<>();
LinkedList<String> lin = new LinkedList<>();
for (int i = 0; i < 10000000; i++) {
arr.add(i, "");
lin.add(i, "");
}
//1.1 从列表的头部开始访问
long time1 = System.currentTimeMillis();
arr.get(10);
long time2 = System.currentTimeMillis();
System.out.println("ArrayList从列表的头部开始访问的时间:" + (time2 - time1));//0
long time3 = System.currentTimeMillis();
lin.get(10);
long time4 = System.currentTimeMillis();
System.out.println("LinkedList从列表的头部开始访问的时间:" + (time4 - time3));//0
//1.2 从列表的中间开始访问
long time5 = System.currentTimeMillis();
arr.get(5000000);
long time6 = System.currentTimeMillis();
System.out.println("ArrayList从列表的中间开始访问的时间:" + (time6 - time5));//0
long time7 = System.currentTimeMillis();
lin.get(5000000);
long time8 = System.currentTimeMillis();
System.out.println("LinkedList从列表的中间开始访问的时间:" + (time8 - time7));//31
//1.3 从列表的尾部开始访问
long time9 = System.currentTimeMillis();
arr.get(9999999);
long time10 = System.currentTimeMillis();
System.out.println("ArrayList从列表的尾部开始访问的时间:" + (time10 - time9));//0
long time11 = System.currentTimeMillis();
lin.get(9999999);
long time12 = System.currentTimeMillis();
System.out.println("LinkedList从列表的尾部开始访问的时间:" + (time12 - time11));//0
//2.插入元素
//2.1 从列表的头部开始插入
long time01 = System.currentTimeMillis();
arr.add(10,"3");
long time02 = System.currentTimeMillis();
System.out.println("ArrayList从列表的头部开始插入的时间:" + (time02 - time01));//547
long time03 = System.currentTimeMillis();
lin.add(10,"3");
long time04 = System.currentTimeMillis();
System.out.println("LinkedList从列表的头部开始插入的时间:" + (time04 - time03));//0
//2.2 从列表的中间开始插入
long time05 = System.currentTimeMillis();
arr.add(5000000,"3");
long time06 = System.currentTimeMillis();
System.out.println("ArrayList从列表的中间开始插入的时间:" + (time06 - time05));//46
long time07 = System.currentTimeMillis();
lin.add(5000000,"3");
long time08 = System.currentTimeMillis();
System.out.println("LinkedList从列表的中间开始插入的时间:" + (time08 - time07));//47
//2.3 从列表的尾部开始插入
long time09 = System.currentTimeMillis();
arr.add(9999999,"3");
long time010 = System.currentTimeMillis();
System.out.println("ArrayList从列表的尾部开始插入的时间:" + (time010 - time09));//0
long time011 = System.currentTimeMillis();
lin.add(9999999,"3");
long time012 = System.currentTimeMillis();
System.out.println("LinkedList从列表的尾部开始插入的时间:" + (time012 - time011));//0
}
}