`
wu.sheng
  • 浏览: 66996 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jdk6标准类库源码解读 之 数据结构 (二) LinkedList<E>

阅读更多

LinkedList<E>

 

 

  • 此对象使用双向循环链表的方式进行。定义内部对象LinkedList.Entry<E>,用于存储链表中的每个节点,每个节点结构包括前一节点指针、后一节点指针、当前节点值。
    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;
        }
    }
  •  此对象存储记录双向链表的头指针和当前链表长度。读取长度时,不会循环链表
    private transient Entry<E> header = new Entry<E>(null, null, null);

    private transient int size = 0;
  •  执行增加节点时,如果不指定位置,插入节点为链表的最后一个节点。由于是双向循环链表,所以直接插入到header节点之前。
    public boolean add(E e) {
        addBefore(e, header);
        return true;
    }

 

    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;
    }
  • 执行移除节点操作时,会顺序遍历每个节点,判断是否满足移除条件。使用引用移除时,从header往后查找,移除第一个匹配到的元素(如果有两个同一引用的节点,则后一个依然存在)。使用索引位置进行移除(或查找get操作)时,根据索引大小是否大于总数的1/2(移位运算),确定是从前往后索引,还是从后往前索引,即所以数量最多不超多链表元素的一半。
    public boolean remove(Object o) {
        if (o == null) {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (e.element == null) {
                    remove(e);
                    return true;
                }
            }
        } else {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (o.equals(e.element)) {
                    remove(e);
                    return true;
                }
            }
        }
        return false;
    }

 

    public E remove(int index) {
        return remove(entry(index));
    }

    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;
    }
  •  indexOf操作同ArrayList,进行顺序的比较查找。
    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;
    }

 

2
9
分享到:
评论

相关推荐

    Java JDK实例宝典

    &lt;br&gt;第1章 Java基础 &lt;br&gt;1.1 转换基本数据类型 &lt;br&gt;1.2 Java的运算符 &lt;br&gt;1.3 控制程序的流程 &lt;br&gt;1.4 计算阶乘 &lt;br&gt;1.5 实现命令行程序 &lt;br&gt;第2章 Java面向对象程序设计 &lt;br&gt;2. 1 复数类 &lt;br&gt;2. 2 equals.chashCode...

    jdk源码 jdk源码

    - **集合框架**: 研究ArrayList、LinkedList、HashMap、HashSet等数据结构的实现。 - **I/O流**: 理解字节流、字符流、缓冲流、对象序列化等概念。 - **网络编程**: 学习Socket通信,HTTP、FTP协议的实现。 - **国际...

    jdk1.8 rt.jar 源码

    2. **集合框架**:`java.util`包中的`ArrayList`、`LinkedList`、`HashMap`、`HashSet`等数据结构的实现,这些是日常编程中最常用的工具。源码可以帮助理解它们的性能特性,比如插入、删除、查找的时间复杂度。 3. ...

    jdk1.6 源码jdk1.6 源码

    深入理解JDK 1.6的源码对于Java开发者来说至关重要,因为它揭示了语言核心库的工作原理,有助于优化代码、理解和解决潜在问题。 1. **Java虚拟机(JVM)**:JDK 1.6中的JVM是Java程序执行的基础,它的主要职责是...

    jdk1.8 sun源码

    6. **集合框架**:`java.util`包中的集合类,如ArrayList、HashMap、LinkedList等,其内部实现细节对于理解数据结构和算法有很大帮助。 7. **I/O流**:`java.io`和`java.nio`包提供了丰富的输入/输出流接口和类,...

    JAVA JDK实例开发宝典源码

    6. **输入输出流**:Java的I/O流系统是处理数据传输的关键,源码会涵盖文件读写、网络通信、序列化等场景,让你了解InputStream、OutputStream、Reader、Writer等类的使用。 7. **反射机制**:反射是Java的高级特性...

    jdk1.6源码

    这些类的源码展示了如何实现数据结构和算法,对于提升算法和数据结构理解有很大帮助。 10. **异常处理** `java.lang.Throwable`及其子类定义了Java的异常处理机制。通过查看源码,我们可以了解到异常的抛出、捕获...

    jdk src 源码 压缩包提取

    在源码中,你可以看到`java.lang`、`java.util`、`java.io`等包中的各种基础类是如何实现的,例如`String`、`ArrayList`、`HashMap`等常用数据结构。 首先,`java.lang`包包含了Java语言的基础类和接口,如`Object`...

    jdk1.7源码包含util

    通过阅读和分析JDK 1.7的源码,我们可以深入了解这些类和接口的实现细节,这对于优化代码性能、排查问题以及设计自己的数据结构和算法都有很大帮助。同时,这也是学习Java语言和提升编程能力的重要途径。

    java jdk 实例宝典(光盘源码)

    Java JDK实例宝典是一本深度探讨Java开发工具集(Java Development Kit)的实践性书籍,其光盘源码为读者提供了丰富的示例代码,便于学习和理解。这本书旨在帮助Java开发者深入掌握JDK中的核心概念和技术,提升编程...

    jdk1.6.0_05源码打包

    9. **标准库扩展**:"javax"包包含了JDK标准扩展,如Swing GUI库、XML处理等。 10. **源码注释**:源码中的注释提供了功能解释、设计决策和使用示例,有助于学习和调试。 通过深入研究JDK 1.6.0_05的源码,开发者...

    jdk1.8.0_211源码.zip

    - 集合框架:深入理解`java.util`包中的ArrayList、HashMap、LinkedList等数据结构的实现。 - 多线程:查看`java.lang.Thread`和`java.util.concurrent`包,理解并发和多线程编程。 - 输入/输出:研究`java.io`包,...

    数据结构(JAVA)\[数据结构(Java版)(第4版)][叶核亚][程序源代码]

    "01.3 JDK"可能涉及Java开发工具包(JDK)的基础知识,包括标准库API的使用和Java开发环境的设置。 这些主题覆盖了数据结构和算法的基础,是学习和实践Java编程所必需的。通过阅读和理解叶核亚的书中的源代码,你...

    java源码解读-jdk_reading:java源码日常阅读与注解

    2. 集合框架(Collections Framework):如ArrayList、LinkedList、HashMap等数据结构的实现,以及它们的性能特点。 3. 多线程(Thread):深入研究线程的创建、同步、唤醒、阻塞等操作的底层实现。 4. 异常处理...

    JDK实例开发宝典 例子 源代码 ,很经典的

    4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashMap、HashSet等数据结构,它们在实际开发中应用广泛。源码实例会展示如何使用这些集合,以及它们在不同场景下的性能差异。 5. **IO流**:Java的IO流...

    java jdk 宝典 源代码

    Java JDK宝典源代码是Java开发者的宝贵资源,它提供了Java开发工具包(JDK)的核心类库和实现的原始源代码。对于深入理解Java语言、API的工作原理以及进行问题排查,阅读源代码是非常有益的。这篇博文中,博主分享了...

    Java JDK实例宝典(夏先波著)书的所有源代码

    《Java JDK实例宝典》是由夏先波编著的一本针对Java初学者和进阶者的重要参考资料,书中包含了丰富的Java编程实例,旨在帮助读者深入理解Java JDK(Java Development Kit)的各项功能和用法。这本书的源代码是学习...

    javajdk源码-java.util_source_learning:学习JDK源代码

    `java.util`包是Java标准库的核心部分,包含了大量的工具类和集合框架,是日常开发中频繁使用的组件。`java.util_source_learning`项目提供了对JDK源码的学习资源,帮助开发者深入探索这个包内的实现细节。 在JDK...

    疯狂java讲义第二版源码

    《疯狂Java讲义第二版》是由知名Java教育专家李刚编写的一本深入浅出的Java编程教程,其源码提供给读者,旨在帮助学习者更好地理解书中所讲解的编程概念和实战技巧。这本书覆盖了大量的Java核心知识,包括基础语法、...

    JDK Doc的下载地址

    它详尽地列出了Java平台标准版(Java SE)的所有类、接口、方法和异常,帮助开发者理解如何使用Java语言及其库。在本文中,我们将深入探讨JDK Doc的下载地址、其重要性以及如何利用它进行高效开发。 首先,JDK Doc...

Global site tag (gtag.js) - Google Analytics