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

时间:2014-11-03 11:33:37

标签: java hashcode

我们说我有这种情况

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

    id = 0L;
    System.out.println( id.hashCode() );

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

  1. 为什么会这样?
  2. 如何省略此项并计算0和-1的正确哈希值?
  3. 预先感谢您的回复:)

2 个答案:

答案 0 :(得分:5)

  

为什么会这样?

因为Long.hashCode的实施是as follows

  

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

(int)(this.longValue()^(this.longValue()>>>32))

  

如何省略这一点并计算0和-1的正确哈希?

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

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

答案 1 :(得分:0)

根据散列函数,2个不同的对象可以具有相同的散列码。

来自Java doc

  

hashCode的一般合约是:

     

每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终如一   返回相同的整数,前提是equals中没有使用的信息   对象的比较被修改。不需要保留该整数   从一个应用程序的执行到另一个执行的一致性   相同的申请。       如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法   产生相同的整数结果。       根据equals(java.lang.Object)方法,如果两个对象不相等则不需要调用hashCode方法   在两个对象中的每一个上必须产生不同的整数结果。   但是,程序员应该意识到产生了不同的   不等对象的整数结果可以提高性能   哈希表。

     

尽可能合理实用,由hashCode方法定义   class Object确实为不同的对象返回不同的整数。 (这个   通常通过转换内部地址来实现   将对象转换为整数,但这种实现技术不是   JavaTM编程语言所要求的。)