009 Java集合浅析4
前面一篇教程中,我们分析了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集合框架 ...
随机推荐
- apache软件包下载地址
主地址: http://commons.apache.org/proper/commons-loggins/download_logging.cgi 镜像1: http://apache.fayea. ...
- HDU3068(Manacher算法)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- [CSS3] 学习笔记-背景与边框相关样式
1.与背景相关的新增属性 包括:backgroud-clip,backgroud-origin,backgroud-size <!DOCTYPE html> <html> &l ...
- WinForm 控件(上)
窗体的事件 每一个窗体都有一个事件,这个窗体加载完成之后执行哪一段代码 位置:1)右键属性→事件→load 双击进入 2)双击窗体任意一个位置进入 删除事件:先将事件页面里面的挂好的事件删除,再删后台 ...
- 5. UITest测试总结
1. 什么是Mock 当我们在做单元测试的过程中,为了保持测试又短又快和测试的隔离性,希望尽可能少地去实例化一些具体的组件.在现在面向对象的系统中,被测试的对象很可能会依赖于几个其他的对象,这时候我们 ...
- 转: 尽己力,无愧于心 FastReport.Net 常用功能总汇
FastReport.Net 常用功能总汇 一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要 ...
- 正则表达式中的match,test,exec,search的返回值
今天突然被问到了正则表达式,因为长时间不用突然不知道怎么用了,只知道有这么个东西.然后去网上查了一下,感觉写的不少,但解释的有点模糊,今天我来浅谈一下. 1,match的用法 A,在不加全局“g”的情 ...
- PHP中的 !== 与 !=
'==' 比较两边的值是否相等,会自动转换类型: '===' 则会严格比较类型是否相同,如果类型不相同,直接返回false. 例如:'123' === 123 // => false '!=' ...
- [Hive] - Hive参数含义详解
hive中参数分为三类,第一种system环境变量信息,是系统环境变量信息:第二种是env环境变量信息,是当前用户环境变量信息:第三种是hive参数变量信息,是由hive-site.xml文件定义的以 ...
- JNI调用的helloworld(JNI_OnLoad映射方式)
本示例展示JNI的基本示例,helloworld级别的,不过是用JNI_OnLoad映射的方式. 直接看代码,先看包含native method的Person.java的代码: package hel ...