gpt4 book ai didi

java - AbstractMap 覆盖哈希码是有问题的

转载 作者:行者123 更新时间:2023-11-30 07:25:12 25 4
gpt4 key购买 nike

在 Java 中细读 AbstractMap 的源代码时,我遇到了这个:

440      /** 
441 * Returns the hash code value for this map. The hash code of a map is
442 * defined to be the sum of the hash codes of each entry in the map's
443 * <tt>entrySet()</tt> view. This ensures that <tt>m1.equals(m2)</tt>
444 * implies that <tt>m1.hashCode()==m2.hashCode()</tt> for any two maps
445 * <tt>m1</tt> and <tt>m2</tt>, as required by the general contract of
446 * {@link Object#hashCode}.
447 *
448 * <p>This implementation iterates over <tt>entrySet()</tt>, calling
449 * {@link Map.Entry#hashCode hashCode()} on each element (entry) in the
450 * set, and adding up the results.
451 *
452 * @return the hash code value for this map
....
456 */
457 public int hashCode() {
458 int h = 0;
459 Iterator<Entry<K,V>> i = entrySet().iterator();
460 while (i.hasNext())
461 h += i.next().hashCode();
462 return h;
463 }

这很有趣,因为它 - 看似意外地 - 排除了哈希码的方式。

如果此方法如所写那样工作,则它排除了哈希码的使用,哈希码加在一起时超过 Integer.MAXINT。如果您正在编写自己的哈希码,您可能想了解这一点。

我能想到至少一个有用的 hashcode 定义,它可能与此冲突,而且它似乎对 hashmap 中的数据量很敏感。具体来说,map中的数据越多,entrySet越大,运行的hashcodes就越大。

这看起来确实像是一个未记录的副作用,也只是一个普通的旧 Bad Idea。其意图似乎是利用加法的交换律 (a+b == b+a) 来生成具有相同条目的映射所需的相等性,但是哇,多么糟糕的实现。

这需要任何人覆盖哈希码 - 这是任何不想仅仅对象实例品牌平等(== 即大多数人)的人,以了解他们不能或不太可能知道的事情。第一个是他们的哈希码的累积总和(谁曾想过这个??),另一个是将被输入到 map 中的项目的最大数量以及它如何影响累积总和。

这只是胡乱涂鸦。任何人有任何见解?如果重要的话,hashcode() 是从类 Object 派生的。

最佳答案

intwrap around / overflow所以在 上方 Integer.MAX_VALUE 将不会抛出异常或在此处引起问题。

这里的主要概念是 hashCode 应该为被认为相同的对象(在特定的程序运行中)产生相同的(整数)值。此代码满足该要求。

请注意,哈希码冲突偶尔会发生,也就是说,在覆盖 hashcode 时,您始终需要提供有意义的 equals 覆盖。

关于java - AbstractMap 覆盖哈希码是有问题的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com