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

LinkedList源码解析(Jdk6)

阅读更多

Java的LinkedList是基于双向链表实现的List集合类。它的特点有:

1.没有容量限制。

2.添加,删除元素比较快;检索元素较慢(较ArrayList)。

3.可能实现为队列,栈

4.线程不安全

下面来看其源码实现:

1.类定义

 

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList继承自AbstractSequentialList,AbstractSequentialList继承AbstractList的大部分功能,实现List,Deque接口,Deque定义了双端队列的一些个方法。可克隆,可被序列化。

2.属性定义

private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;

size:集合的大小。

Entry:LinkedList存储数据的地方,就是靠它实现双向链接,每new一个新的ArrayList实例,就会创建一个空的header,它表示链表的头,来看它的实现:

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;
	}
    }

a.首先它支持泛型

b.属性element用来存储我们实际的值,可以是普通类型,也可以引用类型。

c.属性next和previous实现双向链接的下一个节点,上一个节点

3.构造方法,来看我们new LinkedList()都干了什么

public LinkedList() {
        header.next = header.previous = header;
    }

这是无参构造方法,因为上面讲了,每次new都会创建一个空的header节点,那构造方法做的就是它的下一个节点和上一个节点,这里都是指向自身,从而形成一个闭环。

4.add(),我们看添加元素,它是怎么实现的

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;
    }

它调用了addBefore()方法,在之前插入,那就是每次在header之前插入了,看它实现:

a.new一个新的Entry节点,element为我们添加的元素对象,next节点为header,上一个节点为entry.previous=header.previous=header,即下一个节点和上一个节点都为header。

b.newEntry.previous.next=header.next=newEntry,即将header的下一个节点设置为新创建的Entry节点。

c.newEntry.next.previous=header.previous = newEntry,即将header的上一个节点设置为新创建的Entry节点。这时新插入的newEntry节点便和header形成一个新的闭环。LinkedList就是这样来插入新的元素。

d.size++,LinkedList大小加1。

e.modCount++,修改次数加1。

转一张图过来,其实我自己也用笔画出来了。

理解这个add()方法,能自己画出这张图,LinkedList的实现原理就搞明白了,后面都是它的应用。

5.get()方法

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;
        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;
    }

它调用entry(),size >> 1这个是右位运算,意思是size除以2^1,左移就是乘以2^1,所以这里检索的方法是用被检索的索引值与LinkedList集体大小的一半比较,小于它,从前面开始找,大于它,则从后面开始找。所以它的检索效率没有ArrayList高,但是它插入,删除高效啊。

6.remove()

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;
    }

a.首先找到这个节点,然后调用remove()方法,

b.把它的上一个节点的next指向它的下一个节点,下一个节点的previous指向它的上一个节点,有点绕,但是好理解, 

c.把它自己的下一个节点和上一个节点指向都设置为null,

d.把它的值设置为null

e.修改次数加1,并返回该元素的值。

其它方法还有很多,但理解上面这些,LinkedList就是没问题了

据其它网友的总结:

1.对LinkedList的遍历采用新特性的for循环,效率较高,

for (Integer integ:list) 
    ; 

其次是迭代,千万不要用随机访问,那是ArrayList的强项。

 

参考:

http://www.cnblogs.com/hzmark/archive/2012/12/25/LinkedList.html

http://www.cnblogs.com/skywang12345/p/3308807.html  

 

分享到:
评论

相关推荐

    源码解析jdk7.0集合:LinkedList的底层实现原理.pdf

    接下来,我们将通过JDK 7.0的源码,深入探讨LinkedList的底层实现原理。 首先,LinkedList实现了List接口,因此它是一个有序列表。它还实现了Deque接口,这意味着LinkedList支持双端队列的操作。除了这些接口之外,...

    Jdk1.6 Collections Framework源码解析(2)-LinkedList

    《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...

    jdk源码 jdk源码

    3. **launcher**: 这可能包含了Java应用程序的启动器源码,比如`java.exe`或`javaw.exe`,它们负责解析命令行参数,加载类,以及启动Java虚拟机(JVM)。 4. **java**: 这个目录可能包含了Java标准库的部分源代码,...

    Java基于JDK 1.8的LinkedList源码详析

    "Java基于JDK 1.8的LinkedList源码详析" LinkedList是Java中一个非常重要的数据结构,基于双向链表实现,适用于增删频繁且查询不频繁的场景。今天我们将深入分析LinkedList的源码,了解其内部实现机制和特点。 1. ...

    系统解析JDK源码,领略大牛设计思想,JAVA进阶必备(2023新课,已完结)

    "系统解析JDK源码,领略大牛设计思想,JAVA进阶必备"这一课程或资源包,旨在帮助开发者通过分析JDK源码,学习并掌握其中蕴含的设计模式和编程技巧,从而提升自身的技术深度和广度。 JDK(Java Development Kit)是...

    jdk1.6源码

    《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。JDK1.6作为历史版本,虽然已被更新的JDK版本所替代,但它仍然具有重要的学习价值,尤其对于...

    林信良 jdk6 java学习笔记

    8. **JDK6新特性**:重点解析JDK 6版本引入的新功能,如枚举、泛型的改进、注解(Annotation)的使用等。 9. **Swing图形界面**:教授如何使用Swing库构建用户界面,包括组件使用、布局管理器等。 10. **数据库...

    jdk1.7源代码

    《深入解析JDK1.7源代码》 Java开发人员在面对面试时,经常会遇到关于JDK源码的问题。然而,对于大多数开发者来说,能够详细解答这些源码问题的人并不多。阅读并理解JDK源码,无疑能提升我们的技术水平,增强问题...

    JDK源码选读

    通过对JDK源码的解析,读者可以了解到Java语言的核心机制,提升编程技能和解决问题的能力。这里我们将围绕JDK源码中的关键知识点进行深入探讨。 首先,JDK是Java Development Kit的缩写,它是开发Java应用程序的...

    Java源码解析——看优秀源码最能使人进步

    Java源码解析是一种深入了解JDK源码的方式,适合那些想深入了解JDK源码的人。通过对JDK源码的解析,可以让开发者更好地理解Java语言的底层逻辑,从而写出更加高效、稳定的代码。 本文将对Java.lang.Object类、Java....

    java jdk 实例宝典源码

    Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...

    JDK-s-source-parser:解析jdk源码-源码解析

    JDK-s-source-parser ## Java的JDK原始解析###完成部分Collection / ArrayList.java由:me 2016-3-31 Collection / LinkedList.java发布者:CBQ 2016-4-4

    jdk:jdk源码阅读

    【标题】:深入理解JDK源码 在Java开发领域,深入阅读JDK源码是提升技术水平的重要途径。JDK,即Java Development Kit,是Oracle公司提供的Java开发工具集,包含了Java运行环境、编译器、类库以及各种工具。通过...

    javaJDK1.8 源码(.java文件) 新手教程资料

    1. **基础类库解析**:JDK 1.8源码中包含了大量Java基础类库,如`java.lang`、`java.util`、`java.io`等。这些类库提供了大量的工具类和接口,如`String`、`ArrayList`、`HashMap`等,通过阅读源码,我们可以了解到...

    jdk-源码.rar

    《深入解析Java JDK源码》 Java JDK源码是Java开发者深入理解平台底层运作机制、提升编程技艺的重要参考资料。这份名为"jdk-源码.rar"的压缩包包含了丰富的Java开发工具包(Java Development Kit)的源代码,让我们...

    jdk1.6.0_05源码打包

    4. **集合框架**:"java.util"包包含了ArrayList、LinkedList、HashMap等集合类的源码,可以帮助理解它们的工作原理和效率。 5. **I/O流**:"java.io"包提供了输入/输出流接口和类,是处理文件、网络数据传输的关键...

    jdk_api中文版

    下面将对JDK API的一些核心概念、重要类和接口进行深入解析。 1. **基础类库**:JDK API提供了丰富的基础类库,如集合框架(Collection Framework)、I/O流(IO Streams)、多线程(Multithreading)、网络编程...

    java-jdk源码学习

    - 源码分析可以理解它们的实现原理,如ArrayList和LinkedList的增删查改效率差异,HashMap和ConcurrentHashMap的并发处理方式。 - 学习集合框架有助于优化数据结构,提升程序性能。 5. **多线程** - Java提供了...

    给jdk写注释系列之jdk1.6容器(9)Strategy

    这篇文档是关于Java开发中的一个核心设计模式——策略模式(Strategy Pattern)的深入解析,特别是结合了JDK 1.6版本的容器类库进行讨论。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,...

    jdk-learning:部分jdk源码学习

    【标题】"JDK学习:部分源码解析" 在Java开发领域,深入理解JDK源码对于提升编程技能和优化代码至关重要。"JDK-learning"项目聚焦于对JDK的部分源码进行学习和分析,旨在帮助开发者更好地了解Java运行机制,从而在...

Global site tag (gtag.js) - Google Analytics