我们说我有这种情况
Long id = -1L;
System.out.println( id.hashCode() );
id = 0L;
System.out.println( id.hashCode() );
猜猜是什么?两个输出都给出相同的数字(0)!我的问题是:
预先感谢您的回复:)
答案 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编程语言所要求的。)