加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用HashMap和自定义键

发布时间:2020-12-15 00:38:07 所属栏目:Java 来源:网络整理
导读:快速问题:如果我想使用自定义类作为键的HashMap,我必须覆盖hashCode函数吗?如果我不覆盖该功能,它将如何工作? 解决方法 从技术上讲,只要相等的对象具有相同的hashCode,您就不必重写hashCode方法. 因此,如果您使用Object定义的默认行为,其中equals仅对同一
快速问题:如果我想使用自定义类作为键的HashMap,我必须覆盖hashCode函数吗?如果我不覆盖该功能,它将如何工作?

解决方法

从技术上讲,只要相等的对象具有相同的hashCode,您就不必重写hashCode方法.

因此,如果您使用Object定义的默认行为,其中equals仅对同一实例返回true,则您不必重写hashCode方法.

但是如果你不覆盖equals和hashCode方法,那就意味着你必须确保你总是使用相同的密钥实例.

例如.:

MyKey key1_1 = new MyKey("key1");

myMap.put(key1_1,someValue); // OK

someValue = myMap.get(key1_1); // returns the correct value,since the same key instance has been used;

MyKey key1_2  = new MaKey("key1"); // different key instance

someValue = myMap.get(key1_2); // returns null,because key1_2 has a different hashCode than key1_1 and key1_1.equals(key1_2) == false

实际上,您通常只有一个键实例,因此从技术上讲,您不必重写equals和hashCode方法.

但最佳做法是覆盖用作键的类的equals和hashCode方法,因为有时候您或其他开发人员可能会忘记必须使用相同的实例,这可能导致难以跟踪问题.

请注意:即使您覆盖equals和hashCode方法,也必须确保不以更改equals或hashCode方法结果的方式更改密钥对象,否则映射将无法找到您的值了.这就是为什么建议尽可能使用不可变对象作为键.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读