首页 > 学院 > 开发设计 > 正文

欢迎使用CSDN-markdown编辑器

2019-11-10 17:55:26
字体:
来源:转载
供稿:网友

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。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表