一,前言  

  LinkedList是一个实现了List接口和Deque接口的双端链表。有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。 LinkedList不是线程安全的。

二,LinkList结构

  LinkList内部是一个双向列表的结构,如下图所示。

  

三,LinkList源码阅读

  3.1 LinkList的继承关系

     

   从继承关系可以看出,LinkedList不但继承了List接口同时也继承了Queue接口。

  3.2 LinkedList的构造方法

public LinkedList() {} // 空参构造

public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
} // 带参构造,传入一个集合对象

  3.3 LinkedList的常用方法

public E getFirst() {}  // 获取第一个元素

public E getLast() {} // 获取最后一个节点元素

public E removeFirst() {} // 删除最开始节点元素,并将改元素返回

public E removeLast() {} // 删除最后节点元素,并将改元素返回

public void addFirst(E e) {} // 最前面添加节点元素

public void addLast(E e) {} //添加最后节点元素

public boolean contains(Object o) {} // 判断元素是否存在

public int size() {} // 返回集合长度

public boolean add(E e) {} // 最末尾添加

public boolean remove(Object o) {} // 最末尾删除

public boolean addAll(Collection<? extends E> c) {} // 将一个集合添加到Linkedlist

public boolean addAll(int index, Collection<? extends E> c) {} // 指定索引位置后开始添加集合

public void clear() {} // 清空

// Positional Access Operations

public E get(int index) {} // 更具索引获取数据

public E set(int index, E element) {} // 将指定位置的数字进行替换

public void add(int index, E element) {} // 指定索引添加

public E remove(int index) {} // 删除指定索引位置数据

// Search Operations

public int indexOf(Object o) {} // 返回指定元素的索引

public int lastIndexOf(Object o) {} // 最后一次出现该元素的索引

// Queue operations. 队列方式,增删更快

public E peek() {} // 返回第一个,该方法笔者测试了感觉没什么用,可能没有理解深刻。

public E element() {} // 返回第一个元素

public E poll() {} // 返回和删除第一个元素

public E remove() {} // 返回和删除第一个元素

public boolean offer(E e) {} // 最后面添加元素

public boolean offerFirst(E e) {} // 开始添加元素

public boolean offerLast(E e) {} // 最后添加元素

public E peekFirst() {} // 返回第一个

public E peekLast() {} // 返回最后一个

public E pollFirst() {} // 返回和删除第一个元素

public E pollLast() {} // 返回和删除最后元素

public void push(E e) {} // 前面添加

public E pop() {} // 删除并返回第一个

public boolean removeFirstOccurrence(Object o) {} // 删除第一个

public boolean removeLastOccurrence(Object o) {} // 删除最后一个

public ListIterator<E> listIterator(int index) {} 

/**
* @since 1.6
*/
public Iterator<E> descendingIterator() {} // 转换迭代对象 public Object clone() {} // 复制一个 public Object[] toArray() {} // 转化成数组 @SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {} /**
* @since 1.8
*/
@Override
public Spliterator<E> spliterator() {}

  从方法中发现,有很多相同功能的方法,但是在效率上会有一定的差别。用队列的方式进行添加效率更高。

四,总结 

  LinkedList是基于双端链表的List,其内部的实现源于对链表的操作,所以适用于频繁增加、删除的情况;该类不是线程安全的;另外,由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现。

JDK 1.8源码阅读 LinkList的更多相关文章

  1. JDK 1.8 源码阅读和理解

    根据 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础” 的指引,决定开始阅读下JDK源码. 本文将作为源码阅读总纲 一.精读部分 java.io java.lang java.util ...

  2. JDK 1.8源码阅读 TreeMap

    一,前言 TreeMap:基于红黑树实现的,TreeMap是有序的. 二,TreeMap结构 2.1 红黑树结构 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗 ...

  3. JDK 1.8源码阅读 HashMap

    一,前言 HashMap实现了Map的接口,而Map的类型是成对出现的.每个元素由键与值两部分组成,通过键可以找对所对应的值.Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. 存储数 ...

  4. JDK 1.8源码阅读 HashSet

    一,前言 类实现Set接口,由哈希表支持(实际上是一个 HashMap集合).HashSet集合不能保证的迭代顺序与元素存储顺序相同.HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依 ...

  5. JDK 1.8源码阅读 ArrayList

    一,前言 ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用. 二,ArrayList ...

  6. jdk源码阅读笔记-LinkedHashMap

    Map是Java collection framework 中重要的组成部分,特别是HashMap是在我们在日常的开发的过程中使用的最多的一个集合.但是遗憾的是,存放在HashMap中元素都是无序的, ...

  7. jdk源码阅读笔记-HashSet

    通过阅读源码发现,HashSet底层的实现源码其实就是调用HashMap的方法实现的,所以如果你阅读过HashMap或对HashMap比较熟悉的话,那么阅读HashSet就很轻松,也很容易理解了.我之 ...

  8. JDK部分源码阅读与理解

    本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK ...

  9. JDK源码阅读(三):ArraryList源码解析

    今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...

随机推荐

  1. json、数组、html标签的修改删除

    存数组 var aa=[1,2,3]; var sStorage=window.sessionStorage; sStorage.aa=aa; console.log(sStorage.aa); // ...

  2. Canvas入门到高级详解(下)

    四. Canvas 开发库封装 4.1 封装常用的绘制函数 4.1.1 封装一个矩形 //思考:我们用到的矩形需要哪些绘制的东西呢? 矩形的 x.y坐标 矩形的宽高 矩形的边框的线条样式.线条宽度 矩 ...

  3. MYSQL数据库高可用方案探究

    MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master ...

  4. 怎么让Windows2012和Windows2008多用户同时远程

    具体方法请参照百度经验:http://jingyan.baidu.com/article/cd4c2979f19765756e6e60ec.html.经过实践证明,是没有问题的.

  5. Java编程的逻辑 (91) - Lambda表达式

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. 三层构架和 MVC的区别和理解

    1.三层构架和 MVC 意思一样么? Java WEB 开发中,服务端通常分为表示层.业务层.持久层,这就是所谓的三层架构: 1.表示层负责接收用户请求.转发请求.生成数据的视图等: 2.业务层负责组 ...

  7. 集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误。

    集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误. 解决的方法是添加类型的判断.      LinkedList接口(在代码的使用过程中 ...

  8. java字符串池和字符串堆内存分配

    1. String str=new String("abc")和String str="abc"的字符串“abc”都是存放在堆中,而不是存在 栈中. 2. 其实 ...

  9. 几个常见的Mysql索引问题

    1. 选择性较低的列是否适合加索引? 索引选择性等于列中不重复(distinct)的行数量(也叫基数),与记录总数的比值.范围在0-1之间.数值越大,索引越快. 例如主键是唯一的,不重复的,所以选择性 ...

  10. k8s(4)-使用服务公开应用程序

    Kubernetes中的服务是一个抽象,它定义了一组逻辑Pod和一个访问它们的策略.服务允许从属Pod之间的松散耦合.与所有Kubernetes对象一样,使用YAML (首选)或JSON 定义服务.服 ...