前面一篇教程中,我们分析了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. 第三章 Python 的容器: 列表、元组、字典与集合

    列表是Python的6种内建序列(列表,元组,字符串,Unicode字符串,buffer对象,xrange对象)之一, 列表内的值可以进行更改,操作灵活,在Python脚本中应用非常广泛 列表的语法格 ...

  2. JavaScript 正则表达式入门教程

    正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串 主要分三个部分:基本语法.RegExp对象的方法.JS中支持正则表达式的String对象方法 一.基本语法 在JS中,正则表达式为对象,用如 ...

  3. ubuntu 下安装 cudnn

    安装cudnn前后,GPU跑一个算法的速度分别是139ms和26ms ! 1. 在以下网址选择  cuDNN v5.1 Library for Linux 下载 https://developer.n ...

  4. 微信小程序教程(第二篇)

    如何注册接入小程序及搭建开发环境 小程序接入流程 注册 主要分为注册邮箱与信息登记. 需要重新申请一个新的微信公众帐号,不能使用服务号.订阅号或企业号使用的公众帐号 (微信公众帐号分为四种类型:订阅号 ...

  5. [css]《css揭秘》学习(三)-灵活的背景定位

    一.background-position属性 使用该属性,在不确定容器大小的情况下,也可以指定图案距离容器边缘的位置:但是需要为不支持该属性的浏览器指定回退方案,否则,图案会默认放在左上角. < ...

  6. Oracle VS DB2 数据类型

    =========================Oracle VS DB2==================================== 本文转自:http://www.bitscn.co ...

  7. Python实现多线程HTTP下载器

    本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为 ...

  8. 实现 $.extend 的深复制和浅复制

    $.extend 是jquery常用的一个方法,该方法通过传第一个布尔型参数可以指定为深复制还是浅复制,如何使用不在本文讨论. 先来理解下什么是深复制: var ob1 = {'name' : 'Ja ...

  9. BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)

    这道到是不用看题解,不过太经典了,早就被剧透一脸了 这道题很像ac自动机上的dp(其实就是) 然后注意到n很大,节点很小,于是就可以用矩阵快速幂优化了 时间复杂度为o(m^3 *log n); 蒟蒻k ...

  10. burp插件开发

    最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下: 第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续的代码开发: 第二 ...