List跟踪源码个人记录

LinkedList是基于链表实现的集合,每个元素都在记录上一个元素和下一个元素的内存地址,在增删改查元素都通过上下元素来实现。下面是源码的跟踪过程。

1 实例化linkedList时只是实例化一个linkedList对象,并没有为元素预留空间

2 add()方法,首先是定义了first和last变量来记录整个链表的第一个元素和最后一个元素

Node类如下:

3 get方法,链表的查找元素实现原理是先检查是否数组下班越界,然后采用类似二分法的方法查找元素,就是根据要查找元素的下标,然后根据下标是否大于链表长度的一半来决定从链表的头部开始查找还是从链表尾部查找

4 remove方法,remove方法就是通过维护好node的prev和next元素

ArrayList其实就是一个Object数组,arrayList对象实例化时就只是初始化了一个空的Object数组

1 add方法,add方法除了增加元素之外,在增加元素之前先扩容,每次扩容都是扩充现有数组长度的一半,即扩容后的数组长度=扩容前的长度+扩容前长度的一半

2  remove方法其实就是数组的复制

总结

     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的查找效率高

   

猜你喜欢

转载自my.oschina.net/u/3739402/blog/1647543