Long hashCode为java中的不同对象返回相同的数字

Mac*_*ski 0 java hashcode

假设我有这种情况

    Long id = -1L;
    System.out.println( id.hashCode() );

    id = 0L;
    System.out.println( id.hashCode() );
Run Code Online (Sandbox Code Playgroud)

你猜怎么着?两个输出都给出相同的数字(0)!我的问题是:

  1. 为什么会这样?
  2. 我怎么能省略这个并计算0和-1的正确哈希值?

在此先感谢回复:)

Oli*_*rth 5

为什么会这样?

由于执行的Long.hashCode如下:

结果是此Long对象持有的原始long值的两半的异或.也就是说,哈希码是表达式的值:

(int)(this.longValue()^(this.longValue()>>>32))
Run Code Online (Sandbox Code Playgroud)

我怎么能省略这个并计算0和-1的正确哈希值?

这些适当的哈希.哈希不保证是独一无二的; 事实上,如果有超过2 32个可能的输入值,它们将保证不是唯一的.

如果你想要一个不同的行为,你需要编写一个MyInteger行为不同的类(虽然我怀疑没有真正的理由这样做).