LinkedList是基于链表实现的集合,每一个元素都在记录上一个元素和下一个元素的内存地址,在增删改查元素都经过上下元素来实现。下面是源码的跟踪过程。node
1 实例化linkedList时只是实例化一个linkedList对象,并无为元素预留空间数组
2 add()方法,首先是定义了first和last变量来记录整个链表的第一个元素和最后一个元素spa
Node类以下:对象
3 get方法,链表的查找元素实现原理是先检查是否数组下班越界,而后采用相似二分法的方法查找元素,就是根据要查找元素的下标,而后根据下标是否大于链表长度的一半来决定从链表的头部开始查找仍是从链表尾部查找内存
4 remove方法,remove方法就是经过维护好node的prev和next元素rem
ArrayList其实就是一个Object数组,arrayList对象实例化时就只是初始化了一个空的Object数组get
1 add方法,add方法除了增长元素以外,在增长元素以前先扩容,每次扩容都是扩充现有数组长度的一半,即扩容后的数组长度=扩容前的长度+扩容前长度的一半源码
2 remove方法其实就是数组的复制ast
总结效率
linkedList和ArrayList的相同在实例化对象时都是实例化LinkedList和ArrayList对象,没有其余操做
不一样点
1 扩容机制不一样,LinkedList的扩容其实就是每增长一个元素就new Node对象,即增长一个元素就增长一个节点,一个Node对象就至关于扩容一次
2 增删改不一样
LinkedList每次增长元素都是new Node对象,而后维护好prev、next、first和next就开了,删除元素相似,将要删除的元素设置null,而后维护好上下两个元素的prev和next
ArrayList则是每次增长元素都会调用Arrays.copyOf方法自动扩充一半的容量,而后再增长元素,
删除元素是调用System.arraycopy方法从删除元素的下标+1开始复制数组,而后将最后一个元素设置null
LinkedList的删除元素效率高,由于ArrayList每次删除都要进行一次数组复制,而linkedList直接set为null并维护好prev和next便可;ArrayList修改元素效率高,由于ArrayList的查找效率更高,找到元素以后直接set值便可。新增元素都是经过尾部的方式追加,目前我没有办法比较那个效率更高。
3 查找元素机制不一样
LinkedList是链表模式,没有办法经过下标直接定位到元素,只能从头部或尾部经过prev或next变量一个节点一个节点取出目标元素
ArrayList是数组,能够经过下标直接取出目标元素,ArrayList的查找效率高