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
相关推荐
接下来,我们将通过JDK 7.0的源码,深入探讨LinkedList的底层实现原理。 首先,LinkedList实现了List接口,因此它是一个有序列表。它还实现了Deque接口,这意味着LinkedList支持双端队列的操作。除了这些接口之外,...
《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...
3. **launcher**: 这可能包含了Java应用程序的启动器源码,比如`java.exe`或`javaw.exe`,它们负责解析命令行参数,加载类,以及启动Java虚拟机(JVM)。 4. **java**: 这个目录可能包含了Java标准库的部分源代码,...
"Java基于JDK 1.8的LinkedList源码详析" LinkedList是Java中一个非常重要的数据结构,基于双向链表实现,适用于增删频繁且查询不频繁的场景。今天我们将深入分析LinkedList的源码,了解其内部实现机制和特点。 1. ...
"系统解析JDK源码,领略大牛设计思想,JAVA进阶必备"这一课程或资源包,旨在帮助开发者通过分析JDK源码,学习并掌握其中蕴含的设计模式和编程技巧,从而提升自身的技术深度和广度。 JDK(Java Development Kit)是...
《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。JDK1.6作为历史版本,虽然已被更新的JDK版本所替代,但它仍然具有重要的学习价值,尤其对于...
8. **JDK6新特性**:重点解析JDK 6版本引入的新功能,如枚举、泛型的改进、注解(Annotation)的使用等。 9. **Swing图形界面**:教授如何使用Swing库构建用户界面,包括组件使用、布局管理器等。 10. **数据库...
《深入解析JDK1.7源代码》 Java开发人员在面对面试时,经常会遇到关于JDK源码的问题。然而,对于大多数开发者来说,能够详细解答这些源码问题的人并不多。阅读并理解JDK源码,无疑能提升我们的技术水平,增强问题...
通过对JDK源码的解析,读者可以了解到Java语言的核心机制,提升编程技能和解决问题的能力。这里我们将围绕JDK源码中的关键知识点进行深入探讨。 首先,JDK是Java Development Kit的缩写,它是开发Java应用程序的...
Java源码解析是一种深入了解JDK源码的方式,适合那些想深入了解JDK源码的人。通过对JDK源码的解析,可以让开发者更好地理解Java语言的底层逻辑,从而写出更加高效、稳定的代码。 本文将对Java.lang.Object类、Java....
Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...
JDK-s-source-parser ## Java的JDK原始解析###完成部分Collection / ArrayList.java由:me 2016-3-31 Collection / LinkedList.java发布者:CBQ 2016-4-4
【标题】:深入理解JDK源码 在Java开发领域,深入阅读JDK源码是提升技术水平的重要途径。JDK,即Java Development Kit,是Oracle公司提供的Java开发工具集,包含了Java运行环境、编译器、类库以及各种工具。通过...
1. **基础类库解析**:JDK 1.8源码中包含了大量Java基础类库,如`java.lang`、`java.util`、`java.io`等。这些类库提供了大量的工具类和接口,如`String`、`ArrayList`、`HashMap`等,通过阅读源码,我们可以了解到...
《深入解析Java JDK源码》 Java JDK源码是Java开发者深入理解平台底层运作机制、提升编程技艺的重要参考资料。这份名为"jdk-源码.rar"的压缩包包含了丰富的Java开发工具包(Java Development Kit)的源代码,让我们...
4. **集合框架**:"java.util"包包含了ArrayList、LinkedList、HashMap等集合类的源码,可以帮助理解它们的工作原理和效率。 5. **I/O流**:"java.io"包提供了输入/输出流接口和类,是处理文件、网络数据传输的关键...
下面将对JDK API的一些核心概念、重要类和接口进行深入解析。 1. **基础类库**:JDK API提供了丰富的基础类库,如集合框架(Collection Framework)、I/O流(IO Streams)、多线程(Multithreading)、网络编程...
- 源码分析可以理解它们的实现原理,如ArrayList和LinkedList的增删查改效率差异,HashMap和ConcurrentHashMap的并发处理方式。 - 学习集合框架有助于优化数据结构,提升程序性能。 5. **多线程** - Java提供了...
这篇文档是关于Java开发中的一个核心设计模式——策略模式(Strategy Pattern)的深入解析,特别是结合了JDK 1.6版本的容器类库进行讨论。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,...
【标题】"JDK学习:部分源码解析" 在Java开发领域,深入理解JDK源码对于提升编程技能和优化代码至关重要。"JDK-learning"项目聚焦于对JDK的部分源码进行学习和分析,旨在帮助开发者更好地了解Java运行机制,从而在...