前面一篇教程中,我们分析了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的更多相关文章
-
008 Java集合浅析3
在前面的几节里,本教程从整体架构上去把握了JDK中的集合框架,并简单分析了其中Collection组的*接口,知道Collection接口的常见直接子接口有List.Set和Queue,并就这三个子 ...
-
Java集合框架之TreeMap浅析
Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:
-
Java集合框架之HashMap浅析
Java集合框架之HashMap浅析 一.HashMap综述: 1.1.HashMap概述 位于java.util包下的HashMap是Java集合框架的重要成员,它在jdk1.8中定义如下: pub ...
-
Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
-
Java集合框架之TreeSet浅析
Java集合框架之TreeSet浅析 一.TreeSet综述: 1.1TreeSet简介: TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧: public ...
-
Java集合框架之HashSet浅析
Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...
-
Java集合框架之Set接口浅析
Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...
-
Java集合框架之Vector浅析
Java集合框架之Vector浅析 一.Vector概述: 位于java.util包下的Vector是Java集合框架的重要一员,虽然没有ArrayList那么的常用,但是我们还要对其做相关学习: 1 ...
-
Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
随机推荐
-
JSON字符串和对象之间的转换
JSON(JavaScript Object Notation) 是JavaScript编程语言的一个子集.正因JSON是JavaScript的一个子集,所以它可清晰的运用于此语言中. eval函数 ...
-
POJ 3320 (尺取法+Hash)
题目链接: http://poj.org/problem?id=3320 题目大意:一本书有P页,每页有个知识点,知识点可以重复.问至少连续读几页,使得覆盖全部知识点. 解题思路: 知识点是有重复的, ...
-
Spark SQL - DataFrame
1 Overview Spark SQL is a Spark module for structured data processing. It provides a programming abs ...
-
(转载) ExtJs大比拼JQuery:Dom文档操作
此次不生产水,做一次搬运工. http://www.cnblogs.com/lipan/archive/2011/12/07/2269815.html
-
nginx+keepalived+tomcat之具体配置档
前沿知识点: nginx负责负载均衡(反向代理) msm(memcached session manager)负责缓存会话信息,从而实现会话保持 所需包: nginx和memcached采用最新稳定版 ...
-
JAVA中事物以及连接池
一.事物 什么是事物? 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元.这些单元要么全都成功,要么全都不成功. 做一件事情,这个一件事情中有多个 ...
- Vue 实现网易云音乐 WebApp
-
转:Session,Token相关区别
参考地址:https://www.cnblogs.com/xiaozhang2014/p/7750200.html 1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为htt ...
-
Python的 numpy中 meshgrid 和 mgrid 的区别和使用
一.meshgrid函数 meshgrid函数通常使用在数据的矢量化上. 它适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对. 示例展示: 由上面的示例展示 ...
-
51nod-1222-最小公倍数计数
题意 给到 \(a,b\) ,求 \[ \sum _{i=a}^b\sum _x\sum _y[x\le y][\text{lcm}(x,y)=i] \] 即最小公倍数在 \([a,b]\) 中的有序 ...