从源码分析ArrayList和LinkList的区别
2015-01-31 18:36
591 查看
先写一段代码:
其运行结果分别为:
testArrayList():
testLinkList:
两个方法的运行结果相同,因此要转到各自源码再做分析:
先看LinkList的源码:
LinkList继承了AbstractSequentialList并实现了List接口,查看AbstractSequentialList源码,为:
AbstractSequentialList继承了AbstractList类,再转到AbstractList源码为:
AbstractList依然是实现了List接口。
再来看ArrayList的源码:
ArrayList为:
ArrayList继承了AbstractList类,并实现了List接口,并也继承了AbstractList类,我刚刚画了张图,
来描述这两个类之间的关系。其中画出了ArrayList和LinkList继承的主要的类和接口。
从该图中可以看出ArrayList和LinkList两个类之间其实在继承接口还有父类方面并没有太多的差别,
而其中更是有着许多相同的方法,因此,这两个类之间更多的不同是在于对各自的方法的实现不同。
先来看ArrayList的源码实现:
在ArrayList中声明了一个Object类的数组。
然后:
其次在构造函数中对elementData数组指定大小:
在ArrayList中另外的一个构造函数中:
在此size进行了初始化,在其后几乎所有的的方法中都有size的参与。
再看ArrayList中的indexof()方法的源码:
对数组进行遍历,然后返回一个对应元素的下标。
再看ArrayList中的两个add()方法,其一为:
首先扩大数组容量,其中ensureCapacity()方法的实现为:
扩大容量后,将富足进行复制,然后数组就变成了一个更大的数组,然后我们再回到之前的add方法,
将添进来的元素放入数组中,同时size++,然后返回true、
再看第二个add方法:
第二个add方法适用于在指定位置添加新元素,在指定的下标前的元素不作处理,
在指定下标的后面的所有元素全部向后移一位。
对ArrayList的分析就到这为止,终其究竟,就是对动态数组的增、删、改、查。
再对LinkList进行源码分析:
首先是声明了一个Entry类型的header,然后再声明了一个int类型的size,并且初始化为0;
构造函数为:
这一个默认的构造函数确立header为一个孤立的节点。
下一个带参数的构造函数为:
将传进来的参数使用addAll()方法全部添加到header中
在调用这个addAll()方法后,实质上仍然调用了另外一个addAll()方法,为:
从之前声明的header,以及这个AddAll()方法中,
可看出LinkList内部实际使用的是一个链表来进行值得增、删、改、查。
从另外一个add()方法中更可以看出这个特点:
再调用addBefore()方法,
在这个方法中,转到Entry的构造方法,
可看出就是链表的一个增加节点的操作。
LinkList的分析就到此为止,其他的所有的操作实质上都是基于链表进行的。
总结:
综上,ArrayList实质上就是对Object类型的一个动态数组就行操作,而LinkList则是对一个链表进行各种操作,
而两个类均是实现List这个接口,以及AbstractList这个抽象类。
对于LinkList和ArrayList,ArrayList本身是基于数组,因此,在内存方面占用的空间应该会大一些,
而对应的LinkList基于链表,内存空间占用会小一点,但在查询数据方面,数组的效率明显要高于链表,
因此,ArrayList在查询元素方面会比LinkList快。
对ArrayList和LinkList的分析,就是如此。
package cn.com.ListDemo; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.junit.Test; public class test { @Test public void testArrayList(){ List<String> list=new ArrayList<String>(); list.add("bingwen"); list.add("tom"); list.add("jack"); list.add("john"); list.add(2, "ruby"); for(String str:list){ System.err.println(str); } System.err.println(list.size()); } @Test public void testLinkList(){ LinkedList<String> list=new LinkedList<String>(); list.add("java"); list.add("python"); list.add("C#"); list.add("php"); for(String str:list){ System.err.println(str); } } }
其运行结果分别为:
testArrayList():
testLinkList:
两个方法的运行结果相同,因此要转到各自源码再做分析:
先看LinkList的源码:
LinkList继承了AbstractSequentialList并实现了List接口,查看AbstractSequentialList源码,为:
AbstractSequentialList继承了AbstractList类,再转到AbstractList源码为:
AbstractList依然是实现了List接口。
再来看ArrayList的源码:
ArrayList为:
ArrayList继承了AbstractList类,并实现了List接口,并也继承了AbstractList类,我刚刚画了张图,
来描述这两个类之间的关系。其中画出了ArrayList和LinkList继承的主要的类和接口。
从该图中可以看出ArrayList和LinkList两个类之间其实在继承接口还有父类方面并没有太多的差别,
而其中更是有着许多相同的方法,因此,这两个类之间更多的不同是在于对各自的方法的实现不同。
先来看ArrayList的源码实现:
在ArrayList中声明了一个Object类的数组。
然后:
其次在构造函数中对elementData数组指定大小:
在ArrayList中另外的一个构造函数中:
在此size进行了初始化,在其后几乎所有的的方法中都有size的参与。
再看ArrayList中的indexof()方法的源码:
对数组进行遍历,然后返回一个对应元素的下标。
再看ArrayList中的两个add()方法,其一为:
首先扩大数组容量,其中ensureCapacity()方法的实现为:
扩大容量后,将富足进行复制,然后数组就变成了一个更大的数组,然后我们再回到之前的add方法,
将添进来的元素放入数组中,同时size++,然后返回true、
再看第二个add方法:
第二个add方法适用于在指定位置添加新元素,在指定的下标前的元素不作处理,
在指定下标的后面的所有元素全部向后移一位。
对ArrayList的分析就到这为止,终其究竟,就是对动态数组的增、删、改、查。
再对LinkList进行源码分析:
首先是声明了一个Entry类型的header,然后再声明了一个int类型的size,并且初始化为0;
构造函数为:
这一个默认的构造函数确立header为一个孤立的节点。
下一个带参数的构造函数为:
将传进来的参数使用addAll()方法全部添加到header中
在调用这个addAll()方法后,实质上仍然调用了另外一个addAll()方法,为:
从之前声明的header,以及这个AddAll()方法中,
可看出LinkList内部实际使用的是一个链表来进行值得增、删、改、查。
从另外一个add()方法中更可以看出这个特点:
再调用addBefore()方法,
在这个方法中,转到Entry的构造方法,
可看出就是链表的一个增加节点的操作。
LinkList的分析就到此为止,其他的所有的操作实质上都是基于链表进行的。
总结:
综上,ArrayList实质上就是对Object类型的一个动态数组就行操作,而LinkList则是对一个链表进行各种操作,
而两个类均是实现List这个接口,以及AbstractList这个抽象类。
对于LinkList和ArrayList,ArrayList本身是基于数组,因此,在内存方面占用的空间应该会大一些,
而对应的LinkList基于链表,内存空间占用会小一点,但在查询数据方面,数组的效率明显要高于链表,
因此,ArrayList在查询元素方面会比LinkList快。
对ArrayList和LinkList的分析,就是如此。
相关文章推荐
- 从源码分析ArrayList和LinkList的区别
- 源码分析三(Vector与ArrayList的区别)
- java源码分析之集合框架 ArrayList和LinkedList的区别05
- 源码分析二(ArrayList与LinkedList的区别)
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- java 集合ArrayList及LinkList源码分析
- java 集合ArrayList及LinkList源码分析
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- java中ArrayList 、LinkList的区别分析
- java中ArrayList 、LinkList的区别分析---程序中设比较时间
- java 集合ArrayList及LinkList源码分析
- java中ArrayList 、LinkList的区别分析
- 从源码分析ArrayList和Vector区别
- java 集合ArrayList及LinkList源码分析
- java 集合ArrayList及LinkList源码分析
- java 集合ArrayList及LinkList源码分析
- java 集合ArrayList及LinkList源码分析
- java中ArrayList 、LinkList的区别分析
- ArrayList 源码分析
- ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析