不同哈希码的后果,但两个java对象的结果相同

时间:2016-02-15 10:37:55

标签: java hash hashmap hashcode

我知道我们应该为两个java对象提供相同的hashcodes incase equals,但只是想了解hashcodes是否相同但equals返回{ {1}},对于像HashMap,HashSet等集合的后果是什么。

它只会影响性能还是会影响这些集合类的行为/功能。

6 个答案:

答案 0 :(得分:1)

它会破坏功能。如果要在hashmap或hashset中查找对象,则使用哈希代码来查找它。如果哈希码不一致,它可能无法找到它。

哈希码的最基本要求是两个相等的对象必须具有相同的哈希码。其他一切都是次要的。

答案 1 :(得分:1)

后果将是意外行为。

如果a.equals(b) == truea.hashCode()!=b.hashCode()set.add(a)后跟set.contains(b)则很可能会返回false(假设setHashSet }),即使根据equals它应该返回true。 (它最有可能而且不确定的原因是两个不同的哈希码仍然有可能被映射到HashSet/HashMap的同一个桶,在这种情况下你仍然可以获得true })。

答案 2 :(得分:1)

如果两个对象相等,则它们的哈希码将始终返回相同的值。

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。

请阅读this

答案 3 :(得分:1)

让我们调用对象t.test(v)$conf.int[1]o1 o2o1.equals(o2)

请考虑以下事项:

o1.hashCode() != o2.hashCode()

以下断言将失败

Map map = new HashMap();
Set set = new HashSet();
map.put(o1, "foo");
set.add(o1);

答案 4 :(得分:0)

在获取期间它会丢失该存储桶。 HashMap旨在以最佳方案存储大量数据,获取时间为O(1)。为此,它存储了针对哈希码标记的键/值(我们通常将其称为存储桶)。这称为散列技术。 因此,您将其存储在具有哈希码编号的hashmap中,比如说100,现在您尝试使用不同的哈希码(例如200)获取对象(即查看不同的桶内)。因此,即使您的对象位于hashmap内,它也无法检索它,因为它将尝试在不同的桶中找到(即200)。 这就是我们应该拥有相同的哈希码的原因,两个java对象的incals equals是相同的

答案 5 :(得分:0)

HashMap / HashSet旨在帮助您找到集合中的目标对象。如果两个相等的对象具有不同的哈希码,则您不太可能在哈希存储桶中找到该对象。