学习Java哈希表HashMap时可能会遇到的小困惑

在Java中,当使用HashMap时,如果键对象的equals和hashCode方法已重写,可能出现一些疑问。比如,当两个键对象的成员变量相同,导致它们的hashCode相等,即使一个键被另一个覆盖,HashMap的containsKey方法仍然能返回true。这是因为HashMap的containsKey方法依赖于键的hash值和equals方法来判断是否存在。HashMap的遍历结果是无序的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

而当你使用HashMap存储键值对时,有可能会遇到一个疑问。

下面举一个我遇到的问题:

Person是一个实体类(已经重写了equals和hashCode方法) ,这里的HashMap是官方的HashMap

		Person p1 = new com.mj.set.Person(12,1.67f,"jack");
		Person p2 = new com.mj.set.Person(12,1.67f,"jack");
		java.util.Map<Object, Integer> map2 = new java.util.HashMap<>();
		map2.put(p1,1);
		map2.put(p2,2);
		System.out.println(map2.size());
		System.out.println(map2.containsKey(p1));

当你在主函数执行这段代码时,会发现结果为1,true。
而你可能会有这样的疑惑:你不是已经用p2覆盖了p1吗,为什么map2中还是包含p1?

作出解释:

你翻阅Java官方的HashMap你会发现,那个containsKey(K key)方法是通过传入hash(key);,以及key查找node是否为空,如果为空,则返回false, 否则返回true。

getNode方法

/**
     * Implements Map.get and related methods.
     *
     * @param hash hash for key
     * @param key the key
     * @return the node, or null if none
     */
    final Node<K,V> getNode(int hash, Object key) {
   
        Node<K,V
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值