HashMap和HashSet
发布日期:2022-01-31 20:00:16 浏览次数:27 分类:技术文章

本文共 1502 字,大约阅读时间需要 5 分钟。

HashMap和HashSet

将一个Set集合扩展成了Map集合,由于这个Set采用了HashSet作为实现类,HashSet会使用Hash算法来保存集合中每个SimpleEntry元素,因此扩展出来的Map本质上是一个HashMap。

实际上,HashSet和HashMap之间有很多相似之处。

Set和Map的关系

在看Set和Map之间的关系之前,先来看看Set集合的继承体系,如图3.1所示。

这里写图片描述
再来看Map集合的类继承体系,如图3.2所示。
这里写图片描述
仔细观察图3.2中Map集合的继承体系里被灰色覆盖的区域,可以发现,这些Map接口、实现类和Set集合的接 口、实现类的类名完全相似,把Map后缀改为Set后缀即可。Set集合和Map集合的对应关系如下。
■ Set <-> Map
■ EnumSet <-> EnumMap
■ SortedSet <-> SortedMap
■ TreeSet <-> TreeMap
■ NavigableSet <-> NavigableMap
■ HashSet <-> HashMap
■ LinkedHashSet <-> LinkedHashMap
这些接口和类名如此相似偶然现象,肯定有其必然的原因。

Set< k > keySet()

由此可见,Map集合的所有key将具有Set集合的特征,只要把Map的所有key集中起来看,那它就是一个Set,这实现了从Map到Set的转换。其实,还可以实现从Set到Map的扩展 对于Map而言,相当于每个元素都是key-value对的Set集合。

对于HashSet而言,系统采用Hash算法决定集合元素的存 储位置,这样可以保证快速存、取集合元素;对于HashMap而言,系统将value当成key的附属,系统裉据Hash算法来决 定key的存储位置,这样可以保证快速存、取集合key ,而value总是紧随key存储。

在介绍集合存储之前需要指出一点:虽然集合号称存储的是Java对象,但实际上并不会真正将Java对象放入Set集 合中,而只是在Set集合中保留这些对象的弓|用而已。也就是说,Java集合实际上是多个引用变量所组成的集合,这些引用 变量指向实际的java对象。

这里写图片描述
上面程序先创建2个Apple对象,其中t1指向第1个Apple对象,t2指向第2个Apple对象。此时系统内存的分配如 图3.6所示。
这里写图片描述
接下来,程序创建了一个List集合,并定义了一个list变量指向该List集合。因此,程序创建的实际上是一个初始 长度为4的ArrayList ,也就是说这个List集合的底层长度为4。

提示

ArrayList底层是基于数组实现的,也就是说ArrayList底层封装的是数组,每次创建ArrayList时传入的int参数就 i是它所包装的数组的长度;如果创建ArrayList时没有传入int参数,那么ArrayList的初始长度为10 ,也就是它底层所封装 i的数组的长度为10。

程序创建了一个初始长度为4的ArrayList之后,接着开始尝i式将Java对象放入ArrayList中。这与把Java对象放入 数组中是完全相同的效果:系统不会真正把Java对象放入ArrayList中,只是向ArrayList集合中存入这些Java对象的引用。 当执行两条add语句之后,系统内存分配如图3.7所示。

从图3.7可以看出,此时t1和list集合的第1个元素指向同一个Java对象,t2和list集合的第2个元素也指向同一个
Java对象,因此程序在①、②两行代码处都输出true。

转载地址:https://blog.csdn.net/qq_23315711/article/details/54945096 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:实例变量的初始化时机
下一篇:关于复选框全选问题

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月10日 06时35分55秒