LinkedList 源码小解
一、成员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 源码小解相关推荐
- 从面试角度分析LinkedList源码
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 注:本系列文章中用到的jdk版本均为java8 Linke ...
- LinkedList 源码分析
前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...
- LinkedList源码剖析
1. LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当作链表来操作外,它还可以当作栈,队列和双端队列来使用. LinkedList同样是非线 ...
- Java 集合系列(4): LinkedList源码深入解析1
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList,并了解了fail-fast ...
- java linkedlist源码_Java集合之LinkedList源码分析
一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...
- Java类集框架 —— LinkedList源码分析
在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...
- List接口的常用方法以及ArrayList/LinkedList源码分析
1.List接口的常用方法 ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA"); ...
- 面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析
06 LinkedList 源码解析 智慧,不是死的默念,而是生的沉思. --斯宾诺莎 引导语 LinkedList 适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用,面试也经常问到,本 ...
- 和我一起读Java8 LinkedList源码
书接上一篇ArrayList源码解析,这一节继续分析LinkedList在Java8中的实现,它同样实现了List接口,不过由名字就可以知道,内部实现是基于链表的,而且是双向链表,所以Linked L ...
最新文章
- MySQL数据库+命令大全+常用操作
- 系统架构师考试知识点mp3资料免费下载
- 扬州大学广陵学院计算机网络试卷,扬州大学广陵学院控制工程考试样卷B.doc
- Fibonacci数列使用迭代器实现
- HTML与XHTML区别
- MyBatis的CRUD操作
- 梅耶·马斯克对话邓文迪 直播首秀将上线今日头条、抖音
- 计算机专业能进教育局吗,教育局一般招什么专业
- BZOJ1008[HNOI2008] 越狱
- 区块链开源代码什么意思_区块链可以从开源中学到什么
- 黑苹果声卡HDA无声问题
- 佳能mf4400打印机无线服务器,佳能Canon imageCLASS MF4400 驱动
- 阿里巴巴等大厂的 Java岗位要求是什么?
- 数据仓库专题(21):Kimball总线矩阵说明-官方版
- 云主机是什么,怎么才能购买性价比高的云主机
- kotlin 属性重载
- JDBC学习笔记(SQL语句的执行)
- 计算机组成原理全书知识总结
- 蓝桥杯2020年第十一届C/C++B组(第一次)省赛习题题解
- 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
热门文章
- hdu 2438 Turn the corner [ 三分 ]
- DELL电脑自检代码错误提示含义
- 面试题 02.06. 回文链表
- matlab双轴坐标系对齐0,MATLAB双轴坐标图的画法(详细)
- python显示邮件发送成功失败_python stmp module 163邮箱发送邮件不成功
- python打砖块游戏算法设计分析_python小游戏--打砖块的实现与讲解(python自学总结系列)...
- Python循环完成剪刀石头布游戏
- Unitest框架的使用(四)HTMLTestRunner输出测试报告
- Java阶段2-02JS:08ECMAScript BOM DOM:
- LunarCrush将比特币批评家Peter Schiff列为第二大比特币影响者