目录

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

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

 

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 有一个全新且清晰的认识,各位加油。

作者:yuhuashi
出自:http://www.cnblogs.com/0xcafebabe
本作品采用知识共享署名-相同方式共享 3.0 中国大陆许可协议进行许可。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

分类: Java

标签: JCF

好文要顶 关注我 收藏该文 大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训 大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

0xCAFEBABE
关注 - 14
粉丝 - 87

+加关注

0

0

上一篇:解决 meld 出现 locale.setlocale(locale.LC_ALL,'') 失败的问题
下一篇:(二)一起学 Java Collections Framework 源码之 AbstractCollection

posted on 2017-04-17 09:19 0xCAFEBABE 阅读(226) 评论(0) 编辑 收藏

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册访问网站首页。

【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【免费】从零开始学编程,开发者专属实验平台免费实践!

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

最新IT新闻:
· 美国化学学会起诉Sci-Hub
· 三星电子二季度利润有望创新高 芯片业务首次超英特尔
· 阿里推AliGenie开发者平台 内容和软硬件开发商均可接入
· NVIDIA展示GPU多芯集成技术:显卡性能/流处理器数爆发
· 滴滴司机痛诉乘客:真皮后座被踩破 损失2千元
更多新闻...

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

最新知识库文章:

· 小printf的故事:什么是真正的程序员?
· 程序员的工作、学习与绩效
· 软件开发为什么很难
· 唱吧DevOps的落地,微服务CI/CD的范本技术解读
· 程序员,如何从平庸走向理想?

更多知识库文章...

Powered by: 
博客园 
Copyright ? 0xCAFEBABE

<2017年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

  • 随笔 - 119

  • 文章 - 5

  • 评论 - 102

  • 引用 - 0

公告


时间在流失,还在等什么?


大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训




昵称:0xCAFEBABE
园龄:6年6个月
粉丝:87
关注:14

+加关注

搜索

 

 

常用链接

我的标签

随笔分类(117)

随笔档案(119)

文章分类(4)

相册(14)

积分与排名

  • 积分 - 165070

  • 排名 - 1351

最新评论

阅读排行榜

评论排行榜

推荐排行榜

大数据培训,云培训,数据挖掘培训,云计算培训,高端软件开发培训,项目经理培训

http://www.cnblogs.com/0xcafebabe/p/6662949.html

网友评论