- 浏览: 304965 次
- 性别:
- 来自: 山西
博客专栏
-
天天编程
浏览量:22019
最新评论
-
变脸小伙:
运用到了场景中,希望接力
StringBuffer源码理解 -
fangsj:
IE9 安全设置 把这个禁用掉了
spring mvc 文件上传+本地预览+一次提交 -
xu-ch:
今天面试,遇到这题,求出了相似度,面试官问我算法原理是什么,悲 ...
计算字符串相似度算法——Levenshtein -
flywangfei:
你是创新工场的么?
计算字符串相似度算法——Levenshtein -
scwuwei:
六点起床比较好
《4点起床-最养生和高效的时间管理》读书笔记
LinkedList源码
0.首先这个类中的两个变量
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;
下面的这个size就不用说了,是大小,现在先着重看看 Entry<E> header,
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; } }
就是一个链表,有父节点和子节点,父子节点都是一个对象的引用。
还有就是这个类是LinkedList的内部类,所以变量自然能再外部直接调用了。
1.构造函数
这个对象在声明的时候已经new了一个对象,所以这里可以直接使用里面的方法
节点的子节点和父节点都自己。
//无参构造 public LinkedList() { header.next = header.previous = header; }
这里是无参构造后header的示意图,父子节点都指向自己。只是最初的header对象。
这里所指向的“一个对象”在初始化中为null 。并且没有改变过。
//有参构造 public LinkedList(Collection<? extends E> c) { //这一句可不能忘,对头节点的初始化很重要。 this(); addAll(c); }
在有了添加元素的操作后,entry的指针会指向不同地方。
2.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; }
//在第几个位置添加
public void add(int index, E element) {
//如果在最后的位置添加,直接和上面的添加一样,如果不是,则
addBefore(element, (index==size ? header : entry(index)));
}
private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
//取得头结点
Entry<E> e = header;
//循环节点,从头节点开始循环,这个处理很聪明,先计算index的大小,小于一半的话正向遍历,大于一半的话反向遍历。
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 void addFirst(E e) { //只是在header的下一个开始添加,不多看了。 addBefore(e, header.next); }
public void addLast(E e) { //这个和add方法一样,所以普通的添加方法也是添加到最后的位置。 addBefore(e, header); }
这个是完整的情况,添加,删除都会断开相应的next和previous。同时注意header内部的element不会存储元素。他所指向的对象是null ,在前面也说过。
3.remove
主要是讲要删除元素的Entry调整父子节点就可实现删除。
public E remove() { return removeFirst(); } public E removeFirst() { return remove(header.next); } private E remove(Entry<E> e) { //不能删除头节点 if (e == header) throw new NoSuchElementException(); //这个是用来返回的 E result = e.element; //父节点的子节点指向e的子节点。 e.previous.next = e.next; //子节点的父节点指向e的父节点 e.next.previous = e.previous; //将e设为空。 e.next = e.previous = null; e.element = null; //大小-- size--; modCount++; return result; }
删除元素。这里面的匹配和indexof方法很像。在indexof里面讲。
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; }
4.indexOf
//还是对equals比较
,都是正向循环。没什么新意,循环到头指针后结束。
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;
}
还有一些找第几个元素,返回元素数量,找到头元素,找都最后元素。
发表评论
-
fastcgi中的多线程使用
2012-04-06 22:38 138020.背景 在项目中加入了 ... -
crc循环校验原理和实现
2012-03-29 23:33 194441.CRC简介 CRC(cyclical redundanc ... -
TreeMap源码理解
2012-01-31 10:44 01.首先看构造方法 public TreeMap() { ... -
HashMap源码理解
2012-01-30 21:33 1898看看HashMap对应的源码。 1.类、接口关系 ... -
StringUtils源码理解(下)
2012-01-16 15:46 2265本文介绍StringUtils的剩下的两个方法 1. ... -
StringUtils源码理解(中)有点意思的方法
2012-01-12 00:17 3705这次不按照前面的介绍了,方法都大同小异,下面就介绍几个有意思一 ... -
StringUtils源码理解(上)
2012-01-11 23:08 4823StringUtils 源码,使用的是commons-lang ... -
Properties源码理解
2012-07-05 12:23 3981Properties用来读配置文件 ... -
字符流(一)Reader和Writer源码理解
2011-11-27 20:32 15231.Reader 1.1 继承关系 public ... -
字符流(二)BufferedReader和BufferedWriter源码理解
2011-11-27 20:33 48631.BufferedReader 1.1 继承关系 ... -
DataInputStream和DataOutputStream源码理解
2011-11-17 00:02 44841.FilterInputStream简介 列出主要的内 ... -
InputStream,OutputStream源码理解
2011-11-09 22:50 34241.理解字节流和字符流 按流的形式分: 字节流和字符流。 ... -
File源码理解
2011-11-07 23:55 44141.构造函数 最基本的构 ... -
Thread源码理解
2011-10-23 14:36 43651.首先看一下Runnable接口 ... -
泛型简单回顾
2011-09-06 23:36 1348泛型的简介 1.java引入泛型的好处是安全简单。 2. ... -
Vector源码理解
2011-08-29 23:44 1553Vector类 1.系统的变量 //记录元素的数组 pr ... -
ArrayList源码理解
2011-08-15 21:02 1769构造方法: ... -
Arrays源码理解
2011-08-15 20:34 13801.equals public static boo ... -
StringBuffer源码理解
2011-06-22 19:39 5729StringBuffer 存储和操作字符串 它所继承实现的类 ...
相关推荐
《LinkedList源码学习分析》 LinkedList作为Java集合框架中的一员,是基于链表数据结构实现的线程不安全容器。本文将深入探讨LinkedList的实现原理、核心方法的代码实现,并对比ArrayList,理解其特性和使用场景。 ...
LinkedList源码解析 LinkedList是Java中的一种链表实现,它的底层是一个环形双向链表。在 LinkedList 中,节点之间通过引用相互连接,形成一个链表结构。LinkedList 提供了多种方法来操作链表,包括添加、删除、...
这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,ArrayList是基于动态数组实现的。它的内部是一个Object类型的数组,当添加元素导致容量不足时,会自动扩容。扩容策略...
《ArrayList与LinkedList源码解析》 在Java编程中,ArrayList和LinkedList是两种常见的动态数组,它们都是Java集合框架的一部分,提供了对元素存储和操作的功能。本篇将深入探讨ArrayList和LinkedList的内部实现...
### LinkedList源码分析 #### 一、概述 `LinkedList` 是 Java 集合框架中的一个重要组成部分,它基于双向链表实现。与基于数组的 `ArrayList` 相比,`LinkedList` 在插入和删除操作上更为高效,因为它只需要改变...
总结来说,"linkedlist_链表_"主题深入讲解了链表的基础概念,包括单链表和双链表的创建、节点的添加与删除、链表的逆序操作以及遍历技巧。掌握这些知识对于理解和应用数据结构,尤其是处理动态数据集合,具有重要...
总之,理解并掌握Java的`Map`、`List`、`ArrayList`和`LinkedList`的源码是成为优秀Java程序员的重要步骤。通过学习这些源码,开发者可以更好地选择适合场景的数据结构,优化代码性能,解决潜在问题,并提升编程能力...
Java集合系列之LinkedList源码分析 概述: 本文详细介绍了Java集合系列之LinkedList的源码分析,主要介绍了LinkedList的底层实现、成员变量、构造器、增删改查方法等。LinkedList是一种基于双向链表的数据结构,...
在深入分析JDK 7.0中LinkedList集合的底层实现原理前,我们首先需要了解LinkedList的基本概念。...通过对源码的深入剖析,我们可以更好地理解LinkedList的内部工作原理,并在实际应用中更加合理地使用它。
在Java编程语言中,LinkedList是一个常用的集合类,它实现了List接口,同时也提供了双向链表的实现...在阅读和分析给定的Queue.java和Stack.java文件时,可以从实现原理、方法调用、线程安全等方面进行深入学习和理解。
《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...
在Java编程语言中,集合框架是处理数据的重要组成部分。ArrayList、LinkedList和Vector是三种常见的动态数组实现,...在深入源码阅读和实践过程中,我们可以更深入地理解这些类的设计思想和实现方式,提升编程技能。
总结来说,深入理解ArrayList、LinkedList、HashMap和HashSet的源码,有助于我们更好地利用它们的特性,优化代码性能,并在面临并发问题时做出正确的选择。对于开发人员来说,掌握这些基础数据结构的实现原理是提高...
本篇文章将探讨如何利用`LinkedList`来实现队列和栈这两种数据结构,以及其背后的原理和源码分析。 ### 1. 队列(Queue) 队列是一种先进先出(FIFO, First In First Out)的数据结构。在Java中,可以使用`...
Java源码解析LinkedList Java源码解析LinkedList是Java集合框架中的一种重要数据结构。它是一种双向链表,具有高效的...通过了解LinkedList的源码,我们可以更好地理解它的内部实现机制,并更好地应用于实际开发中。
深入理解JDK 1.6的源码对于Java开发者来说至关重要,因为它揭示了语言核心库的工作原理,有助于优化代码、理解和解决潜在问题。 1. **Java虚拟机(JVM)**:JDK 1.6中的JVM是Java程序执行的基础,它的主要职责是...
在查看提供的源码时,你可以深入理解LinkedList内部节点结构的实现,以及这些方法的底层逻辑。例如,LinkedList的节点类(Node)通常包含元素值和对前后节点的引用。通过分析源码,你可以更好地了解其在不同场景下的...
集合框架包括ArrayList、LinkedList、HashMap等,它们的实现细节对于理解数据结构和算法至关重要。I/O流处理文件读写、网络通信,其内部机制有助于开发者构建高效的数据传输系统。网络编程的源码展示了TCP/IP协议栈...
6. **集合框架**:`java.util`包中的集合类,如ArrayList、HashMap、LinkedList等,其内部实现细节对于理解数据结构和算法有很大帮助。 7. **I/O流**:`java.io`和`java.nio`包提供了丰富的输入/输出流接口和类,...