前面一篇教程中,我们分析了List派别中的最常见也最重要的一个类ArrayList<E>。从我们的分析来看,ArrayList作为动态数组的模拟,使用的是连续内存空间来存储数据,带来了可随机访问数据元素便利的同时,也有着插入和删除效率低下的缺点。针对插入和删除操作频度较高的场合,我们应该考虑使用LinkedList<E>集合。

LinkedList<E>对应的基础数据结构是链表,意味着用来存储元素的内存空间不必是连续的,元素不是存储在相邻的空间。本篇教程我们就来看看LinkedList<E>的庐山面目。首先,该类的层次结构图:

可以看到,LinkedList与ArrayList最大的变化有二:一是LinkedList多实现了一个Deque接口;二是LinkedList并不是AbstractList的直接子类,它们中间还有一个AbstractSequentialList类。

我们首先来看一眼Deque<E>的类层次结构:

可以看到这个接口组的继承结构是非常简单的,Queue接口对应的是单端队列,Deque接口对应的是双端队列。既然LinkedList实现了Deque接口,也就意味着LinkedList完全可以当作Deque来使用。至于AbstractSequentialList的引入仅仅是为了代码复用,所以具有顺序访问特性的列表集合实现类只需继承本类就可以节省多个方法的重复实现代码逻辑。当然,如果是具有随机访问特性的列表集合类,是不能继承此类的。

前面说过,ArrayList<E>模拟的是我们基础数据结构中的链表,我们学习的教科书上关于链表都是使用的C/C++中的指针来实现的,但是Java语言的语法中是没有指针,那么Java中是如何来实现链表的呢?我们来看一下源码就清楚了。首先,看一下ArrayList<E>中用来模拟节点的内部类Node<E>:

private static class Node<E> {

E item;

Node<E> next;

Node<E> prev;

Node(Node<E> prev, E element, Node<E> next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

可以看到,Java语法中的引用充当了C/C++语言中指针的角色。

最后,来看看LinkedList<E>源码有哪些值得关注的地方:

public class LinkedList<E>

extends AbstractSequentialList<E>

implements List<E>, Deque<E>, Cloneable, java.io.Serializable

{

transient int size = 0;

transient Node<E> first;

transient Node<E> last;

}

第一点:类的三个主要成员都使用了transient修饰符,但类又实现了Serializable接口,原理我在上一篇教程中已经详细讲解过,这里就不重复了。第二点:类中实现自Deque<E>接口的所有方法都是在JDK1.6才加入的,如果使用老版本的JDK需要注意方法的可使用性。第三点:ArrayList和LinkedList都可以正确地处理null。

通过这篇和上一篇教程的分析,我们已经能很好地掌握它们之间的区别,包括它们各自的优缺点和适用场合。我通过一个简单图表总结如下:

在今后的集合容器的选择过程中,需要考虑使用场景的特点:是访问和修改操作频率高还是插入和删除操作高,选择最好的集合类型。

本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。

                

009 Java集合浅析4的更多相关文章

  1. 008 Java集合浅析3

    在前面的几节里,本教程从整体架构上去把握了JDK中的集合框架,并简单分析了其中Collection组的顶级接口,知道Collection接口的常见直接子接口有List.Set和Queue,并就这三个子 ...

  2. Java集合框架之TreeMap浅析

    Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:

  3. Java集合框架之HashMap浅析

    Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...

  4. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  5. Java集合框架之TreeSet浅析

    Java集合框架之TreeSet浅析 一.TreeSet综述: 1.1TreeSet简介: TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧: public ...

  6. Java集合框架之HashSet浅析

    Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...

  7. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

  8. Java集合框架之Vector浅析

    Java集合框架之Vector浅析 一.Vector概述: 位于java.util包下的Vector是Java集合框架的重要一员,虽然没有ArrayList那么的常用,但是我们还要对其做相关学习: 1 ...

  9. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

随机推荐

  1. 微信扫码下载APP

    前段时间开发过程中,要实现一个扫描二维码下载APP的功能,但是苹果系统中,微信不可以直接跳转苹果商店,需要先下载应用宝,显然太麻烦... 这样我们可以做个中间页,用中间页面生成二维码链接,在中间页代码 ...

  2. HDU 1006 [Tick Tick]时钟问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题目大意:钟表有时.分.秒3根指针.当任意两根指针间夹角大于等于n°时,就说他们是happy的, ...

  3. [No0000B7]If else 与 三元表达式? : 效率对比

    先看 if else 一段代码 using System; class Program { private static void Main() { ; ) i = -; ; Console.Writ ...

  4. 使用fullPage.js遇到的问题以及翻译

    使用fullPage.js做一简单页面,遇一古怪问题:.section中的h1标签始终被一插件生成的标签包裹,导致样式调整好不困难!花费数小时排查为何会生成这样一个标签,最终在fullPage.js的 ...

  5. [html5] 学习笔记-Canvas应用

    通过使用HTML5游戏开发的引擎CreatJS,创建HTML5 Canvas上的更好交互. 1.认识CreateJS CreateJS是一个外部库,用它可以比Canvas更方便的绘制图形. 官网:ht ...

  6. [html] 学习笔记-Canvas图形绘制处理

    使用Canvas API 可以将一个图形重叠绘制在另外一个图形上,也可以给图形添加阴影效果. 1.Canvas 图形组合 通过 globalCompositeOperation = 属性 来指定重叠效 ...

  7. pwnable.kr-fd-Writeup

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  8. SQLSERVER 运维日记-数据库状态

    背景 新年伊始,小伙伴是不是还处于假期综合症的状态.我们在日常运维数据库的时候,会时常查看数据库的状态,检查数据库是否正常运行.对于这些状态的熟悉对于我们处理数据库无法访问的 问题非常重要.当数据库突 ...

  9. TCP报文段的首部格式

    首部20个字节的的固定部分,40个字节的可选部分 (1)源端口和目的端口 (2)序号(是字节流的编号,0-2^32-1),如果超过了mod2^32 (3)确认号:目的主机希望源主机收到的下一个字节序号 ...

  10. SpringBoot实践 - SpringBoot+MySql+Redis

    大家都知道redis的强大之处,在目前应用上也是大显神威. 先说说他的优点: 1 读写性能优异 2 支持数据持久化,支持AOF日志和RDB快照两种持久化方式 3 支持主从复制,主机会自动将数据同步到从 ...