一.概述
- LinkedList继承Deque,所以LinkedList的插入删除操作遵循先进性出FIFO。
- LinkedList继承Deque,所以Linkedist实现了Deque的操作,比喻offer peek pollfirst/last等操作。其实这些操作也就是建立在getFirst getLast addFirst addLast removeFirst removeLast这几个操作上的。
二 .成员变量
- //头节点
- private transient Entry<E> header = new Entry<E>(null, null, null);
- private transient int size = 0;
三 .节点Entry对象
- //节点
- private static class Entry<E> {
- E element; //当前节点存储的元素
- Entry<E> next; //当前节点的下一个节点
- Entry<E> previous; //当前节点的上一个节点
- Entry(E element, Entry<E> next, Entry<E> previous) {
- this.element = element;
- this.next = next;
- this.previous = previous;
- }
- }
四.构造函数
- //初始化
- public LinkedList() {
- header.next = header.previous = header;
- }
五 .存数据
- //默认插入到最后
- public boolean add(E e) {
- addBefore(e, header);
- return true;
- }
- //把元素e插入最前
- public void addFirst(E e) {
- //等价于把元素e插入到原第一个节点header.next的前面
- addBefore(e, header.next);
- }
- //把元素e插入最后
- public void addLast(E e) {
- //等价于把元素e插入到header的前面,因为是双链表
- addBefore(e, header);
- }
- //在指定位置插入元素e,原index处和以后的元素往后移
- public void add(int index, E element) {
- //index == size,把元素e插入到header的前面
- //其他情况把元素e插入entry(index)的前面
- addBefore(element, (index == size ? header : entry(index)));
- }
- //把元素e插入到指定entry的前面
- 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;
- }
五 .取数据
- //取指定位置的元素
- public E get(int index) {
- return entry(index).element;
- }
- private Entry<E> entry(int index) {
- if (index < 0 || index >= size)
- throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
- + size);
- Entry<E> e = header;
- //在链表中取值时,需要遍历整个链表,
- //即使优化成遍历半个链表,相对于ArrayList的随机访问,还是慢的
- 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;
- }
- //取第一个节点处的元素
- public E getFirst() {
- if (size == 0)
- throw new NoSuchElementException();
- return header.next.element;
- }
- //取最后一个节点处的元素
- public E getLast() {
- if (size == 0)
- throw new NoSuchElementException();
- return header.previous.element;
- }
- //和ArrayList一样的算法,只是ArrayList遍历数组,LinkedList遍历链表
- 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;
- }
六.删数据
- //remove默认删除第一个位置的元素
- public E remove() {
- return removeFirst();
- }
- public E removeFirst() {
- return remove(header.next);
- }
- public E removeLast() {
- return remove(header.previous);
- }
- //和ArrayList一样的算法,只是ArrayList遍历数组,LinkedList遍历链表
- public boolean remove(Object o) {
- if (o == null) {
- for (Entry<E> e = header.next; e != header; e = e.next) {
- if (e.element == null) {
- //转换成remove(Entry)
- remove(e);
- return true;
- }
- }
- } else {
- for (Entry<E> e = header.next; e != header; e = e.next) {
- if (o.equals(e.element)) {
- //转换成remove(Entry)
- remove(e);
- return true;
- }
- }
- }
- return false;
- }
- //转换成remove(Entry)
- public E remove(int index) {
- return remove(entry(index));
- }
- //删除指定节点:删除操作都将落到这个方法上
- 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;
- }
七 .遍历
- private class ListItr implements ListIterator<E> {
- private Entry<E> lastReturned = header;
- private Entry<E> next;
- private int nextIndex;
- private int expectedModCount = modCount;
- //初始化的时候next = header.next;
- ListItr(int index) {
- if (index < 0 || index > size)
- throw new IndexOutOfBoundsException("Index: " + index
- + ", Size: " + size);
- if (index < (size >> 1)) {
- next = header.next;
- for (nextIndex = 0; nextIndex < index; nextIndex++)
- next = next.next;
- } else {
- next = header;
- for (nextIndex = size; nextIndex > index; nextIndex--)
- next = next.previous;
- }
- }
- public boolean hasNext() {
- return nextIndex != size;
- }
- //遍历的时候next = next.next,按照从头往后遍历,也就是FIFO的顺序
- public E next() {
- checkForComodification();
- if (nextIndex == size)
- throw new NoSuchElementException();
- lastReturned = next;
- next = next.next;
- nextIndex++;
- return lastReturned.element;
- }
- }
相关推荐
### Java集合容器知识点详解 #### 一、集合容器概述 - **定义**:集合容器是Java平台提供的标准组件,主要用于存储对象。...通过本篇文章的学习,希望读者能够更好地理解和应用Java集合容器,提升编程技能。
《深入Java8的集合2:LinkedList的实现原理》 LinkedList是Java编程语言中实现List接口的一种数据结构,它采用双链表的方式存储元素。本文将深入解析LinkedList的内部机制,帮助开发者理解其工作原理。 首先,...
- **集合框架**:Java的ArrayList, LinkedList, HashMap等容器类的使用会在源码中体现,帮助理解数据存储和操作。 - **泛型**:源码将展示如何使用泛型编写类型安全的代码,减少类型转换的麻烦。 - **枚举**:...
- **集合框架**:熟练运用ArrayList、LinkedList、HashMap、HashSet等容器,了解它们的性能特点和使用场景。 - **多线程**:理解线程的创建方式,同步机制如synchronized和Lock,以及并发工具类。 2. **微服务...
2. **Tomcat**:不仅可以解析 JSP 动态页面,还可以作为 Servlet 容器。 3. **JBoss**:是一个全面的应用服务器,可以部署各种 Java 应用。 #### 五、GET 与 POST 区别 1. **数据提交方式**: - **GET**:通过 ...
### 一、集合容器概述 #### 1. 什么是集合? 集合(Collection)是指在Java中用来存储、检索及操作一组对象的一种容器。它是一种高级的数据结构,主要用于管理一组对象,而不仅仅是简单地存储这些对象。 #### 2. ...
在Java学习笔记中,我们重点关注Java的IO(输入/输出)操作、常用类库以及集合框架。 1. **Java IO**: - **File类**:提供了文件和目录的基本操作,如创建、删除、重命名等。 - **RandomAccessFile**:支持对...
Google-Apps-Script-LinkedList GAS 中的 LinkedList 功能(Google Apps 脚本) 例子 // To add var ll = new LinkedList ( ) ; ll . add ( 'foo' ) ; ll . add ( 'foo2' ) ; ll . add ( 'foo3' ) ; // To add 2 ...
#### 八、EJB技术基础及SessionBean与EntityBean的区别 - **EJB 技术基础**:基于 JNDI、RMI/IIOP、JMS、JDBC 等技术。 - **SessionBean 与 EntityBean 区别**: - **SessionBean**:用于业务逻辑处理,分为有状态...
Java.util 源码分析 Java.util 包是 Java 核心库的重要组成部分,它包含了许多用于日常编程的工具类和接口,如集合框架、日期时间处理、随机数生成、事件处理等。深入理解这个包的源码对于提升Java开发者的技能至关...
- **List**:有序的集合,允许重复元素,如ArrayList和LinkedList,它们类似于可变长度的数组。 - **Map**:存储key-value对的对象,如HashMap、TreeMap和Hashtable,它们不继承Collection接口,因为它们的元素...
Java集合框架主要包括两种类型的容器:集合(Collection)和映射(Map)。其中集合用于存储一组不重复的对象,而映射则用于存储键值对。 #### 二、集合(Collection) Java中的集合框架主要包括以下几种类型的集合...
- **LinkedList**: 使用双向链表实现,适合频繁插入和删除操作。 - **ArrayList**: 使用动态数组实现,适用于随机访问。 - **Vector**: 类似于ArrayList,但提供线程安全性。 - **Set**: 无序且不包含重复元素的...
- **回溯法**:解决组合问题和搜索问题,如八皇后问题、N皇后问题、迷宫问题。 - **动态规划**:用于优化多阶段决策过程,如背包问题、最长公共子序列、最短路径问题。 - **贪心算法**:局部最优解策略,如霍夫曼...
循环的java源码压缩cs-实施-a-链表实验室 目标 用 Java 实现一个链表。 编写 List 接口的实现。 概述 在本实验中,我们提供了 List 接口的部分实现,该接口使用链表来存储元素。 我们留下了三个不完整的方法; 您的...
### 2019互联网面试题第2季之...通过以上分析,我们可以看到,在Java编程中选择合适的字符串处理工具、集合类型以及会话管理技术对于提高程序性能和安全性至关重要。开发者应根据具体的应用场景和技术需求合理选择。
在深入分析JDK 7.0中LinkedList集合的底层实现原理前,我们首先需要了解LinkedList的基本概念。LinkedList,即双向链表,是一种通过双向指针相互连接的数据结构,每个节点包含数据域以及指向前驱和后继节点的指针。...
### 容器(Container)知识点详解 #### 一、数组(Array) **数组定义**: 数组是一种基本的数据结构,用于存储相同类型的多个元素。数组是Java中最简单且高效的容器之一,能够提供快速的元素访问。 **特点**: - **...
在本项目"collectionJava源码-Edureka-Java-Assignment"中,我们主要关注的是Java集合框架的源代码分析,这是在Edureka的Amdocs课程中作为学习任务提交的。这个压缩包"Edureka-Java-Assignment-master"很可能包含了...