交流?独裁?技术-目的-改变世界...远离编程,珍爱生命。


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


 


 

posted @ 2014-04-04 09:55  Jinx007  阅读(410)  评论(0编辑  收藏  举报

Medivh 麦迪文——世界最后的守护者。