【问题标题】:@override hashcode() in HashMap [duplicate]HashMap中的@override hashcode() [重复]
【发布时间】:2019-12-02 06:06:42
【问题描述】:

我从这里读到了 hash 和 HashMap:https://howtodoinjava.com/java/collections/hashmap/design-good-key-for-hashmap/

特别是:

//Depends only on account number
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + accountNumber;  
    return result;
}

为什么哈希码是用prime * result + accountNumber计算的,而不仅仅是accountNumber

定值prime *结果是什么意思? 为什么不只是素数(结果值为 1,所以素数时间 1 是素数)?

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    引用this SO answer,质数对于确保对象中字段的所有值组合创建不同且唯一的哈希码是必要的。是的,当您只有一个 int 字段时,这可能不是必需的,但是一旦您想添加任何字段,您就需要将实现更改为上述源;这当然是不可取的,并且该解决方案适用于所有用例,因此最好从一开始就使用它。

    【讨论】:

      【解决方案2】:

      代码生成使用它以便在 多个 字段的情况下具有随机性:

      result = prime * result + accountNumber;  
      result = prime * result + hairColorAsInt; // Biometrics to identify account
      result = prime * result + userWeight;  
      

      确实不需要,但在这里它可能有一个目的:如果可能,accountNumber 不应该泄漏到外部,因此将其复制到 hashCode 中是不可取的。我不知道存储 hashCode 的任何序列化,所以它是一个弱论点。

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2023-03-20
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        • 2011-06-11
        相关资源
        最近更新 更多