HashMap的判断重复和解决哈希冲突

哈希冲突
当用key的hashCode()得到了相应的存储位置,并用equals()判断是否有相同的key时,若key不相等就产生了哈希冲突,要用链地址法存储.相同的话就得value覆盖旧的value.
HashMap的put()用hashCode() && equals() 判断key是否重复
Java的规范1:
若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
Java的规范2:
如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
可以推出的结论
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
put方法
当put一对<key,value>时,先用hashCode() && equals() 判断key是否重复
如果重复则不插入
如果hashCode()为true,则会用hashCode判断在相应的位置插入key,如果这个判断的位置已经有了值了,则会调用equals()去判断是否重复,equals()为true则视为key重复不插入,若equals()为false则认为不重复,以链的形式插入
get方法
首先得到key的hashCode()去得到值存的位置,然后用equals()去一个一个比较,为true则就是相应的value,否则不是
在这里插入图片描述
https://blog.csdn.net/prh1023/article/details/80652704
https://blog.csdn.net/weixin_37751634/article/details/82882222

### 回答1: HashSet和HashMap都是Java中的集合类,但它们的实现方式不同。HashSet是基于HashMap实现的,它是一种不允许有重复元素的集合,底层使用HashMap来存储元素,将元素作为key存储,value则是一个固定的Object对象。而HashMap则是一种键值对存储的集合,它允许key和value都为null,但不允许有重复key。在使用时,需要根据具体的需求来选择使用哪种集合。 ### 回答2: HashSet和HashMap都是Java集合框架中常用的数据结构。 HashSet是一个基于哈希表的集合,它实现了Set接口。它不允许重复的元素,内部使用HashMap来存储元素值,并使用元素的HashCode作为键。HashSet的特点是添加和查找元素的复杂度都为O(1),但是元素的顺序是不确定的。 HashMap是一个基于哈希表的键值对集合,它实现了Map接口。它也使用了哈希表来存储键值对,其中键的唯一性是通过键的HashCode和equals方法来判断的。HashMap的特点是根据键来查找值的复杂度为O(1),但是取出键值对的顺序是不确定的。 HashSet与HashMap的主要区别有以下几点: 1. 集合元素类型:HashSet是存储唯一元素的集合,而HashMap是存储键值对的映射。 2. 数据结构:HashSet内部使用HashMap来存储元素值,而HashMap则是使用哈希表来存储键值对。 3. 存储方式:HashSet存储的是唯一元素值,HashMap则是通过键值对存储。 4. 元素顺序:HashSet的元素顺序是不确定的,HashMap则根据键的HashCode来确定键值对的存储位置,取出顺序也是不确定的。 5. 性能:HashSet和HashMap的添加和查找元素的复杂度都为O(1),但是HashMap需要额外存储键值对的映射关系。 综上所述,HashSet和HashMap在功能和使用方式上有所不同,根据实际需求选择适合的集合是很重要的。 ### 回答3: HashSet和HashMap是Java中两个常用的集合类,它们的区别主要体现在以下几个方面: 1. 存储方式:HashSet是基于哈希表实现的,使用哈希算法来存储元素;而HashMap也是基于哈希表实现的,但是每个元素都包含一个键值对。 2. 元素的唯一性:HashSet中不允许重复元素的存在,当试图向HashSet中添加一个已经存在的元素时,该操作会被忽略;而HashMap中的键是唯一的,但值可以重复。 3. 访问方式:HashSet中的元素是无序的,没有索引,只能使用迭代器进行遍历;而HashMap中的元素是通过键来访问的,可以通过键直接获取对应的值。 4. 性能:HashSet的性能相对较高,因为它只需要计算元素的哈希值即可查找元素;而HashMap要计算键的哈希值,并且需要处理哈希冲突,所以性能相对较低。 综上所述,HashSet适用于需要存储唯一元素且不需要对元素进行键值对操作的场景;而HashMap适用于需要根据键快速查找对应值的场景,且允许键有重复
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值