四、ArrayList和LinkedList内部的实现大致是怎样的?
1、ArrayList集合
ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存分配一个更大的数组来存储这些元素,因此ArrayList集合看做一个长度可变的数组。
2、LinkedList集合
LinkedList是List接口的另一个实现类。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素。
3、时间复杂度
//get方法两者之间的对比
package com.jqka;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class ListTest{
public static final int N=50000;
public static List values;
static{
Integer vals[]=new Integer[N];
Random r=new Random();
for(int i=0,currval=0;i<N;i++){
vals[i]=new Integer(currval);
currval+=r.nextInt(100)+1; //随机生成1~100之间的整数
}
values=Arrays.asList(vals);//将一个数组转化为一个List对象
}
static long timeList(List lst){
long start=System.currentTimeMillis();
for(int i=0;i<N;i++){
int index=Collections.binarySearch(lst, values.get(i));
if(index!=i)
System.out.println("***错误***");
}
return System.currentTimeMillis()-start;
}
public static void main(String args[]){
System.out.println("ArrayList消耗时间:"+timeList(new ArrayList(values)));
System.out.println("LinkedList消耗时间:"+timeList(new LinkedList(values)));
}
}
运行结果:
ArrayList消耗时间:11
LinkedList消耗时间:3842
//add方法两者之间的对比
package com.jqka;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListDemo {
static final int N=50000;
static long timeList(List list){
long start=System.currentTimeMillis();
Object o = new Object();
for(int i=0;i<N;i++)
list.add(0, o);
return System.currentTimeMillis()-start;
}
public static void main(String[] args) {
System.out.println("ArrayList耗时:"+timeList(new ArrayList()));
System.out.println("LinkedList耗时:"+timeList(new LinkedList())); } }
运行结果:
ArrayList耗时:189
LinkedList耗时:4
总结:
1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2、由于数组的结构允许程序通过索引的方式来访问元素,因此,对于随机访问get和set,ArrayList优于LinkedList,ArrayList可以随机定位,而LinkedList要移动指针一步一步到节点处。
3、对于add和remove,LinkedList就比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的空间。