--说起这两者,本来就来源于同一脉,虽说本是同根,但是差别还是有的,下面就来一起找一下他们的异同吧!
--先来说说构造函数
/*
* 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) LinkedList和ArrayList都实现了Serializable接口,因此他支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆
(3) 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,ArrayList中允许元素为null在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null.
---绵薄之力,希望能够帮助到你