HashSet与HashMap的联系和区别

HashSet:

    HashSet实现了Set接口,不允许集合中出现重复的元素。

HashMap:

    HashMap实现了Map接口,Map接口对键和值进行映射,不允许出现重复的键

 

HashMap通过散列表来存储对象,由数组+链表/红黑树的结构组成组成,数组的一个元素为一个哈希桶。

存储对象时,会调用hashCode()方法计算出哈希值(int),通过对哈希值取余的方式得到哈希桶的位置,若哈希值冲突,则在每个哈希桶采用链表/红黑树结构进行存储。

散列表的初始容量为16,散列因子为0.75,即占用容量达到初始容量的0.75时,散列表便会自动扩容。初始容量和散列因子可通过HashMap的构造方法来设置

HashMap在存储对象时,会先通过hashCode()方法计算对象的哈希值,哈希值决定了对象该放在哪个桶中。如果再有一个对象存储在这个桶里,通过equals判断两个对象是否是同一对象,若是,则覆盖,若不是,则在该数组下标里通过链表存储(超过8个后,通过红黑树存储)。

对象作为键存储,这也就解释了为什么键不能重复。

 

 HashSet去除重复元素的原理:HashSet基于HashMap的结构进行存储,HashSet是一个 值都相等的但键不同 的HashMap,HashSet在存储键时,会根据equals去除重复的键。

HashSet或HashMap在存储对象时,要重写 equals() 和 hashCode() 方法,hashCode()用来确定对象在散列表中的存储地址,equals()则保证了对象不重复。

若两个对象的hashCode相等,不一定equals,反过来则一定。

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读