.

.

.

.

.

目录

(一)一起学 Java Collections Framework 源码之 概述

JDK 中很多类 LZ 已经使用了无数次,但认认真真从源码级研究过其原理的还只占少数,虽然从网上看过无数篇讲解 Java 集合框架中各个类原理的文章,但从未看过源码的 LZ 总有一种道听途说的感觉。于是 LZ 决定将 JDK 中常用的模块逐个深入到源码中一探究竟,并将学习过程记录下来与大家分享。

首先对 Java 集合框架(JCF, Java Collections Framework)有一个整体的认识,来看图1。

图1 Java 集合框架图(图片来源于网络)

从 图1 可以看出来,JCF 分为两条主线,一条是以 java.util.Collection 接口为顶级接口的线性表结构,另一条是以 java.util.Map 为顶级接口的键值(K-V)映射结构。

一、Collection

Collection 接口下分为 List(序列)、Set(去重序列)和 Queue(队列),实现了此接口的数据结构都是线性的。

1.List

List 是有序 collection。用户可以精确控制每一个元素的位置,并可以像数组一样通过索引(下标)来访问元素。ArrayList、LinkedList、Vector、Stack 均实现了此接口,因此它们都是有序的数据结构。

1) ArrayList 是使用数组实现可变长度有序的集合,它允许包含 null 元素,并且不是同步的(is not synchronized)。因此它的访问速度比 LinkedList 高,但由于随机插入、删除动作需要移动元素,此时性能比 LinkedList 差。

2) Vector 与 ArrayList 几乎相同,但此类是同步的(is synchronized)。

3) Stack 是基于 Vector 实现的栈结构,因此它具有后进先出(LIFO)的特点,并且它也是同步的(is synchronized)。

4) LinkedList 是对 List 接口的链表实现,它不是使用数组来实现的,因此每个元素之间的存储空间并不是连续的。它同样允许包含 null 元素,并且不是同步的(is not synchronized)。基于链表实现的 LinkedList 迭代性能不如 ArrayList 高,但优点是随机插入、删除元素的性能高于 ArrayList。

2.Set

Set 是不包含重复元素的 collection,且最多只允许包含一个 null 元素。由于 Set 无法保证有序,所以无法用索引来访问元素(可以通过迭代器等方式来访问元素)。

1) HashSet 是基于哈希表对 Set 接口的实现类,因此无法保证迭代顺序。此类允许 null 元素,并且同样不是同步的(is not synchronized)。

2) LinkedHashSet 与 HashSet 不同的是,它可以保证迭代顺序。

3) TreeSet 会根据元素的自然顺序或通过构造函数指定的 java.util.Comparator 比较器进行排序。此实现也不是同步的(is not synchronized)。

3.Queue

Queue 是队列。图1 中没有将其子类画出来,其实在 JCF 中实现了队列的数据结构还是比较多的,因为只要仅可以从两端访问的线性表我们就可以认为它是一个队列了,所以将其它线性表作为队列使用还是比较容易的。

1) ArrayDeque 是使用大小可变数组实现的双端队列,也可以把它当做栈来使用,替代 java.util.Stack 类。此类不是同步的(is not synchronized)。

二、Map

Map 是用于存储键值对的数据结构,重复的键(Key)会被覆盖,但值(Value)是允许重复的。

1) HashMap 是基于哈希表的 Map 接口的实现,因此无法保证映射的顺序。它允许 null 作为 Key 和 Value,并且不是同步的(is not synchronized)。

2) LinkedHashMap 与 HashMap 的不同是,它的迭代顺序是可预知的。

3) Hashtable 与 HashMap 的不同是,它是同步的(is synchronized),并且 Key 和 Value 不可以是 null。

4) TreeMap 会根据元素的自然顺序或通过构造函数指定的 java.util.Comparator 比较器进行排序。此实现不是同步的(is not synchronized)。

关于 Map 往往我们存在几个容易混淆的地方,一个认为 Map 就是使用 hash 算法实现的,其实并非如此。让我们产生此种认知是因为平时最常用的实现类是 HashMap 或 Hashtable,而 TreeMap 就不是采用 hash 算法实现的。

另一个认为 HashSet 也是 Map 接口的实现,其实 Set 并非键值对存储格式,所以怎么会实现 Map 接口呢,只不过它与 HashMap 均采用了 hash 算法而已,不要混淆。

还有一个认为 Map 都是无序的,其实也并非完全如此,LinkedHashMap 就是有序的。

如果你也对以上三点含糊不清,待与 LZ 共同学习完本系列的博文,就不会再对上面的东西产生混淆了,而是会对整个 JCF 有一个全新且清晰的认识,各位加油。

(一)一起学 Java Collections Framework 源码之 概述的更多相关文章

  1. (二)一起学 Java Collections Framework 源码之 AbstractCollection

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...

  2. Java集合框架源码分析(2)LinkedList

    链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...

  3. Java Collections Framework概览

    本文github地址 概览 容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK 1.2,优点是: 降 ...

  4. Java Collections Framework知识结构目录

    The core collection interfaces are the foundation of the Java Collections Framework. The Java Collec ...

  5. Java Collections Framework Java集合框架概览

    Java SE documents -- The Collections Framework http://docs.oracle.com/javase/8/docs/technotes/guides ...

  6. 我快被Framework源码烦死了!

    前言 这段时间,忙到没时间学新东西,都有点心有余而力不足,想着抽空补补课,于是重读了Framework源码. 因为Framework源码太重要了,像掉帧监控.函数插装.慢函数检测.ANR 监控.启动监 ...

  7. 如何读懂Framework源码?如何从应用深入到Framework?

    如何读懂Framework源码? 首先,我也是一个应用层开发者,我想大部分有"如何读懂Framework源码?"这个疑问的,应该大都是应用层开发. 那对于我们来讲,读源码最大的问题 ...

  8. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  9. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

随机推荐

  1. js基础---cookie存储

    一.Cookie是什么Cookie是一种客户端(浏览器)把用户信息以文件形式存储到本地硬盘的技术,说白了就是一种浏览器技术 二.Cookie的作用Cookie的作用很单一,就是存储客户数据.(存储数据 ...

  2. 深入理解 JavaScript 异步系列(1)—— 什么是异步

    前言 2014年秋季写完了<深入理解javascript原型和闭包系列>,已经帮助过很多人走出了 js 原型.作用域.闭包的困惑,至今仍能经常受到好评的留言. 很早之前我就总结了JS三座大 ...

  3. ER图是啥?

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现 ...

  4. 根据模板导出Excel报表并生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...

  5. WCF请求数据:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。

    通常情况下,写好WCF服务后都会用自带的WCFClient工具进行测试,在进行时数据请求的时候,如果返回数据量超过默认接收值的时候就会提示如图异常错误. 错误也提示的很清楚,无非就是修改接收值大小的问 ...

  6. ORACLE 12C 基础

    连接到PDB数据库 CMD窗口:sqlplus 用户名/密码@localhost:1521/PDB数据库名    示例:sqlplus xiaozijie/Abc4681101@localhost:1 ...

  7. 源码分析——从AIDL的使用开始理解Binder进程间通信的流程

    源码分析——从AIDL的使用开始理解Binder进程间通信的流程 Binder通信是Android系统架构的基础.本文尝试从AIDL的使用开始理解系统的Binder通信. 0x00 一个AIDL的例子 ...

  8. Linux块设备IO子系统(二) _页高速缓存

    磁盘驱动就是实现磁盘空间和内存空间数据上的交互,在上一篇中我们讨论了内存端的Page Segment Block Sector相关的概念,本文以3.14内核为例,讨论这部分内存是如何被组织管理的.我们 ...

  9. ThinkPHP3.2.3版本验证码异步第二次验证时失败的问题解决

    最近在用TP3.2.3做一个小项目,纠结于验证码验证问题,重点在于二次验证,举个例子就是常见的登录页面上有个验证码输入框,当用户输入验证码并且鼠标点击在这个输入框之外时候,触发onblur事件,然后a ...

  10. 受限玻尔兹曼机(RBM)原理总结

    在前面我们讲到了深度学习的两类神经网络模型的原理,第一类是前向的神经网络,即DNN和CNN.第二类是有反馈的神经网络,即RNN和LSTM.今天我们就总结下深度学习里的第三类神经网络模型:玻尔兹曼机.主 ...