LinkedList和ArrayList异同

--说起这两者,本来就来源于同一脉,虽说本是同根,但是差别还是有的,下面就来一起找一下他们的异同吧!

--先来说说构造函数

/* 
* ArrayList三个构造方法 
 */  
 public ArrayList(int initialCapacity); 
 public ArrayList();
 public ArrayList(Collection<? extends E> c);
 /*
  * LinkedList两个构造方法
  */
    public LinkedList();
    public LinkedList(Collection<? extends E> c);

---内部空间

/*
*这里是个LinkedList的内部的类
*/
private static class Entry {   
         Object element;   
         Entry next;   
         Entry previous;   
     }  
每个Entry对象reference列表中的一个元素,同时还有在LinkedList中它的上一个元素和下一个元素。一个有1000个元素的LinkedList对象将有1000个链接在一起的Entry对象,每个对象都对应于列表中的一个元素。这样的话,在一个LinkedList结构中将有一个很大的空间开销,因为它要存储这1000个Entity对象的相关信息。 

ArrayList使用一个内置的数组来存储元素,这个数组的起始容量是10.当数组需要增长时,新的容量按如下公式获得:新容量=(旧容量*3)/2+1,也就是说每一次容量大概会增长50%。这就意味着,如果你有一个包含大量元素的ArrayList对象,那么最终将有很大的空间会被浪费掉,这个浪费是由ArrayList的工作方式本身造成的。如果没有足够的空间来存放新的元素,数组将不得不被重新进行分配以便能够增加新的元素。对数组进行重新分配,将会导致性能急剧下降。如果我们知道一个ArrayList将会有多少个元素,我们可以通过构造方法来指定容量。我们还可以通过trimToSize方法在ArrayList分配完毕之后去掉浪费掉的空间。


--二者都来自于List,其中ArrayList底层实现是数组,而LinkedList的底层实现是单链表。

二者有如下特点:

关系图:


1.ArrayList查找快,增删慢。LinkedList相反,查找慢,增删快;

--代码如下:

/*
	 * 添加时间
	 */
    static long timeList(List list){
	       long start=System.currentTimeMillis();
	          for(int i=0;i<5000;i++) {
	             list.add(0, i);
	        }
	         return System.currentTimeMillis()-start;
	     }
	 
    /*
     * 查询时间
     */
	     static long readList(List list){
        long start=System.currentTimeMillis();
	        for(int i=0,j=list.size();i<j;i++){
	
	        }
	         return System.currentTimeMillis()-start;
	    }
	     
	/*
	 * 集合添加数据
	 */
	    static List addList(List list){
	        for(int i=0;i<5000;i++) {
           list.add(0, i);
	         }
	         return list;
	     }
	    public static void main(String[] args) {
	        System.out.println("ArrayList添加"+5000+"条耗时:"+timeList(new ArrayList()));
	         System.out.println("LinkedList添加"+5000+"条耗时:"+timeList(new LinkedList()));
	 
         List list1=addList(new ArrayList<>());
	        List list2=addList(new LinkedList<>());
	         System.out.println("ArrayList查找"+5000+"条耗时:"+readList(list1));
	         System.out.println("LinkedList查找"+5000+"条耗时:"+readList(list2));
	    }
--运行结果:


--但达到百万级数据是,区别就会更加的明显


--它们其实还有一些方法也有不相同,所以实现的效果也不一样

 /*
*Arraylist的方法
*/
public boolean add(E e)
 public E remove(int index)


 /*
*Linklist的方法
*/
 public void addLast(E e)
public void addFirst(E e)
public boolean add(E e)
public E removeFirst()
public E removeLast()
//Linklist可以实现堆栈的效果,Arraylist则不行

--来看看它们的相同点

(1)ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同,,而List接口继承了Collection接口,Collection接口又继承了Iterable接口,因此可以看出List同时拥有了Collection与Iterable接口的特性

(2) LinkedListArrayList都实现了Serializable接口,因此他支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆

(3) 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null.



---绵薄之力,希望能够帮助到你





猜你喜欢

转载自blog.csdn.net/mr_xiayijie/article/details/80425755