一、成员private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;底层维护的是一个Entry链表(双向循环链表)二、LinkedList.Entry类成员E element; //data
Entry<E> next; //前指针
Entry<E> previous; //后指针

三、方法1、public LinkedList() {
header.next = header.previous = header;
}该方法构造了一个新的Entry链表,前后指针都指向自身2、public E getFirst() {
if (size==0)
throw new NoSuchElementException();return header.next.element;
}获取链表中第一个元素3、public E getLast() {
if (size==0)
throw new NoSuchElementException();return header.previous.element;
}获取链表中最后一个元素4、private E remove(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}移除链表中的某个元素5、private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}插入一个元素 6、public boolean addAll(int index, Collection<? extends E> c) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew==0)
return false;
modCount++;Entry<E> successor = (index==size ? header : entry(index));
Entry<E> predecessor = successor.previous;
for (int i=0; i<numNew; i++) {
Entry<E> e = new Entry<E>((E)a[i], successor, predecessor);
predecessor.next = e;
predecessor = e;
}
successor.previous = predecessor;size += numNew;
return true;
}在链表最后面添加7、private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}获得index对应的Entry对象,如果index>size>>1则使用前指针,如果index<size>>1 则使用后指针遍历到索引处8、public int indexOf(Object o) {
int index = 0;
if (o==null) {
for (Entry e = header.next; e != header; e = e.next) {
if (e.element==null)
return index;
index++;
}
} else {
for (Entry e = header.next; e != header; e = e.next) {
if (o.equals(e.element))
return index;
index++;
}
}
return -1;
}获取元素对应的索引位置9、public boolean removeLastOccurrence(Object o) {
if (o==null) {
for (Entry<E> e = header.previous; e != header; e = e.previous) {
if (e.element==null) {
remove(e);
return true;
}
}
} else {
for (Entry<E> e = header.previous; e != header; e = e.previous) {
if (o.equals(e.element)) {
remove(e);
return true;
}
}
}
return false;
}移除最后一次出现的元素10、private class ListItr implements ListIterator<E> list中用来遍历的iterator类型11、public Iterator<E> descendingIterator() {
return new DescendingIterator();
}private class DescendingIterator implements Iterator用于倒序遍历的iterator

转载于:https://www.cnblogs.com/lige-H/p/7392258.html

LinkedList 源码小解相关推荐

  1. 从面试角度分析LinkedList源码

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 注:本系列文章中用到的jdk版本均为java8 Linke ...

  2. LinkedList 源码分析

    前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...

  3. LinkedList源码剖析

    1. LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当作链表来操作外,它还可以当作栈,队列和双端队列来使用. LinkedList同样是非线 ...

  4. Java 集合系列(4): LinkedList源码深入解析1

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList,并了解了fail-fast ...

  5. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

  6. Java类集框架 —— LinkedList源码分析

    在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...

  7. List接口的常用方法以及ArrayList/LinkedList源码分析

    1.List接口的常用方法 ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA"); ...

  8. 面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析

    06 LinkedList 源码解析 智慧,不是死的默念,而是生的沉思. --斯宾诺莎 引导语 LinkedList 适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用,面试也经常问到,本 ...

  9. 和我一起读Java8 LinkedList源码

    书接上一篇ArrayList源码解析,这一节继续分析LinkedList在Java8中的实现,它同样实现了List接口,不过由名字就可以知道,内部实现是基于链表的,而且是双向链表,所以Linked L ...

最新文章

  1. MySQL数据库+命令大全+常用操作
  2. 系统架构师考试知识点mp3资料免费下载
  3. 扬州大学广陵学院计算机网络试卷,扬州大学广陵学院控制工程考试样卷B.doc
  4. Fibonacci数列使用迭代器实现
  5. HTML与XHTML区别
  6. MyBatis的CRUD操作
  7. 梅耶·马斯克对话邓文迪 直播首秀将上线今日头条、抖音
  8. 计算机专业能进教育局吗,教育局一般招什么专业
  9. BZOJ1008[HNOI2008] 越狱
  10. 区块链开源代码什么意思_区块链可以从开源中学到什么
  11. 黑苹果声卡HDA无声问题
  12. 佳能mf4400打印机无线服务器,佳能Canon imageCLASS MF4400 驱动
  13. 阿里巴巴等大厂的 Java岗位要求是什么?
  14. 数据仓库专题(21):Kimball总线矩阵说明-官方版
  15. 云主机是什么,怎么才能购买性价比高的云主机
  16. kotlin 属性重载
  17. JDBC学习笔记(SQL语句的执行)
  18. 计算机组成原理全书知识总结
  19. 蓝桥杯2020年第十一届C/C++B组(第一次)省赛习题题解
  20. 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动

热门文章

  1. hdu 2438 Turn the corner [ 三分 ]
  2. DELL电脑自检代码错误提示含义
  3. 面试题 02.06. 回文链表
  4. matlab双轴坐标系对齐0,MATLAB双轴坐标图的画法(详细)
  5. python显示邮件发送成功失败_python stmp module 163邮箱发送邮件不成功
  6. python打砖块游戏算法设计分析_python小游戏--打砖块的实现与讲解(python自学总结系列)...
  7. Python循环完成剪刀石头布游戏
  8. Unitest框架的使用(四)HTMLTestRunner输出测试报告
  9. Java阶段2-02JS:08ECMAScript BOM DOM:
  10. LunarCrush将比特币批评家Peter Schiff列为第二大比特币影响者