Java集合源码阅读笔记-LinkedList

 本文转自http://blog.youkuaiyun.com/ns_code/article/details/35787253

关于LinkedList的源码,给出几点比较重要的总结:

    1、从源码中很明显可以看出,LinkedList的实现是基于双向循环链表的,且头结点中不存放数据,如下图;


    2、注意两个不同的构造方法。无参构造方法直接建立一个仅包含head节点的空链表,包含Collection的构造方法,先调用无参构造方法建立一个空链表,而后将Collection中的数据加入到链表的尾部后面。

    3、在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。

    4、LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法。

    5、注意源码中的Entry<E> entry(int index)方法。该方法返回双向链表中指定位置处的节点,而链表中是没有下标索引的,要指定位置出的元素,就要遍历该链表,从源码的实现中,我们看到这里有一个加速动作源码中先将index与长度size的一半比较,如果index<size/2,就只从位置0往后遍历到位置index处,而如果index>size/2,就只从位置size往前遍历到位置index处。这样可以减少一部分不必要的遍历,从而提高一定的效率(实际上效率还是很低)。

    6、注意链表类对应的数据结构Entry。如下;

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 双向链表的节点所对应的数据结构。    
  2. // 包含3部分:上一节点,下一节点,当前节点值。    
  3. private static class Entry<E> {    
  4.     // 当前节点所包含的值    
  5.     E element;    
  6.     // 下一个节点    
  7.     Entry<E> next;    
  8.     // 上一个节点    
  9.     Entry<E> previous;    
  10.   
  11.     /**   
  12.      * 链表节点的构造函数。   
  13.      * 参数说明:   
  14.      *   element  —— 节点所包含的数据   
  15.      *   next      —— 下一个节点   
  16.      *   previous —— 上一个节点   
  17.      */   
  18.     Entry(E element, Entry<E> next, Entry<E> previous) {    
  19.         this.element = element;    
  20.         this.next = next;    
  21.         this.previous = previous;    
  22.     }    
  23. }    
    7、LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)
    8、要注意源码中还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值