ArrayList和LinkedList
ArrayList和LinkedList都实现了List接口,区别在于它们存储的数据结构不同,它们都是线性存储结构,单ArrayList属于顺序式存储而LinkedList属于链式存储:
它们的大致区别是:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.ArrayList每次add添加的对象后,取出来属于一个Object类型的数据。而LinkedList每次add添加元素之后,实际则是添加了一个Entry对象,Entry对象结构如下:
{
Entry previous;//指向上一个元素的索引
Object element;//本元素的具体数据
Entry next;//指向下一个元素的索引
}
测试程序:
import java.util.LinkedList;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class ListTest
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
for(int i=0;i<5000;i++)
{
list.add("Test"+i);
}
System.out.println("ArrayList查找最后一个元素耗时:"+timeList(list,"Test4999"));
List<String> list1 = new LinkedList<String>();
for(int i=0;i<5000;i++)
{
list1.add("Error"+i);
}
System.out.println("LinkedList查找最后一个元素耗时:"+timeList(list1,"Error4999"));
}
static long timeList(List<String> lst,String str)
{
long start=System.currentTimeMillis();
for(int i=0;i<5000;i++)
{
Collections.binarySearch(lst, str);
}
return System.currentTimeMillis()-start;
}
}
多次测试结果如下:
ArrayList查找最后一个元素耗时:5
LinkedList查找最后一个元素耗时:579
----------------------------------------------------------
ArrayList查找最后一个元素耗时:7
LinkedList查找最后一个元素耗时:341
----------------------------------------------------------
ArrayList查找最后一个元素耗时:6
LinkedList查找最后一个元素耗时:339
总结:查找过程中由于LinkedList是链式的,所以每次查找都从第一个索引开始,但是ArrayList可以直接指向其中的索引。这就是两者最大的不同之处。配合上上面三条,两种继承于List接口的类操作的范围就要根据实际情况而确定。与常规的数组不同,常规的数组一般定义的时候需要直接定义数组的大小,那么数组在内存中的大小就是固定的,而继承于List接口的集合类,如(ArrayList和LinkedList)你,你可以不定义它的大小,它们在内存中的大小也不固定,如果利用它们默认的构造方法,new出来一个,那么默认它们的容量是10,也就是它们的索引最大为9;如果超过了这个初始值,它们扩充大小,但是每次扩充的范围有规律,譬如如下扩充过程:10->16->25->38->58->88->...
那么就可以认为大致规律如下:新容量=旧容量*(3/2)+1。