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集合框架 ...
随机推荐
- AutoItLibrary安装报错(robotframework)解决
官网下载地址:http://www.softpedia.com/get/Programming/Components-Libraries/AutoItLibrary.shtml Csdn下载地址:ht ...
- 001.net开发环境与变量
1 .net 技术平台,用来创建互联互通的应用程序 2 应用 嵌入式开发企业级应用 3 .NET Framework 技术:公共语言运行时 .NET Framework的工作模式:.NetC#> ...
- HDU4403(暴搜)
A very hard Aoshu problem Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- java 多线程安全问题-同步代码块
/* 多线程的安全问题: while(true) { if(tick>0) { //线程0,1,2,3在余票为1时,都停滞在这里,之后分别获得CPU执行权,打印出0,-1,-2等错票 Syste ...
- Struts系列笔记(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- Spring DM所提供的Bundle监听接口OsgiBundleApplicationContextListener
通过使用Spring DM提供的监听接口,我们可以更好的对服务进行管控,其实该接口也非常简单就能使用上,只要自定义一个类实现OsgiBundleApplicationContextListener接口 ...
- 数组&&函数数组
数组:一次性定义多个同类型的变量,数组在 内存中存储空间必须是连续的(查询比较快)定义数组: int a[]; int[] a;分配空间: a=new int[5]; 自动为数组元素赋以默认值 a[0 ...
- C语言总结
我们用了20天的时间左右的时间来学习简单的C语言,对于C语言,总体来说我是学的不是特别透彻,感觉自己什么都不懂一样.明天就要考试了,希望明天考个好成绩,为明年打下一个良好的基础. 这段时间我们学习了: ...
- 安装和配置Symfony
为了简化创建新项目的过程,Symfony提供一个安装程序. 安装Symfony Installer 使用Symfony Installer是创建新的Symfony项目的唯一推荐方式,这个install ...
- java读取Excel文档插入mysql
/** * 读取excel插入myslq */package com.excel; import java.io.BufferedInputStream;import java.io.File;imp ...