我在很多地方读到,在Java语言中覆盖equals
方法的同时,也应该覆盖hashCode
方法,否则就是“违反合同”。
但是到目前为止,如果我只覆盖equals方法,而不覆盖hashCode方法,我还没有遇到任何问题。
合同是什么?当我违反合同时,为什么我不会面临任何问题?在哪种情况下,如果我没有覆盖hashCode方法,我将面临一个问题?
发布于 2013-06-10 23:48:45
约定是,如果使用obj1.equals(obj2)
,则使用obj1.hashCode() == obj2.hashCode()
,这主要是出于性能原因,因为映射主要使用hashCode方法来比较条目键。
发布于 2013-06-10 23:49:25
看看Hashtables
,Hashmaps
,HashSets
等等。它们都将散列密钥存储为它们的密钥。当调用get(Object key)
时,将生成参数的散列并在给定的散列中查找。
如果没有覆盖hashCode()
,并且键的实例已更改(例如,一个根本不重要的简单字符串),则hashCode()
可能会导致同一对象有两个不同的哈希码,从而导致在map.get()
中找不到给定的键。
发布于 2013-06-10 23:46:26
约定是:如果两个对象相等,则它们应该具有相同的散列码,如果两个对象不相等,则它们可能具有或不具有相同的散列码。
尝试在HashMap中使用你的对象作为键(在joachim-sauer的评论之后编辑),你会开始面临麻烦。合同是一个指导方针,而不是强加给你的东西。
https://stackoverflow.com/questions/17027777
复制相似问题