Java 为什么新的整数(i).hashCode()返回i?

Java 为什么新的整数(i).hashCode()返回i?,java,hashcode,Java,Hashcode,我想知道为什么newinteger(I).hashCode()或newlong(I).hashCode()返回I,但是当其他对象调用hashCode()时,比如newdouble(345).hashCode(),它返回一个随机数。为什么?整数的值是一个足够好的散列,因为它与唯一整数本身一样唯一 double必须以不同的方式散列,因为这里的散列必须是整数。整数的值是一个足够好的散列,因为它与唯一整数本身一样唯一 必须以不同的方式对double进行散列,因为这里的散列必须是整数。因为 因为他们会说:

我想知道为什么
newinteger(I).hashCode()
newlong(I).hashCode()
返回
I
,但是当其他对象调用
hashCode()
时,比如
newdouble(345).hashCode()
,它返回一个随机数。为什么?

整数的值是一个足够好的散列,因为它与唯一整数本身一样唯一


double必须以不同的方式散列,因为这里的散列必须是整数。

整数的值是一个足够好的散列,因为它与唯一整数本身一样唯一

必须以不同的方式对double进行散列,因为这里的散列必须是整数。

因为

因为他们会说:


因为
整数的
int
值完全满足并完全符合以下总合同:

hashCode的总合同为:

  • 在Java应用程序的执行过程中,每当在同一对象上多次调用hashCode方法时,只要没有修改对象上的equals比较中使用的信息,hashCode方法必须始终返回相同的整数。从应用程序的一次执行到同一应用程序的另一次执行,该整数不必保持一致

  • 如果根据equals(Object)方法两个对象相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果

  • 根据equals(java.lang.Object)方法,如果两个对象不相等,则对这两个对象中的每一个调用hashCode方法都必须产生不同的整数结果,这不是必需的。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能

简而言之:

如果
equals()
返回
true
,则两个对象的哈希代码必须相同,如果
equals()
返回
false
,则哈希代码应该不同(但不是必需的)。通过声明
Object.hashCode()
它必须是
int
。理想情况下,散列代码应该依赖于散列的所有数据

长的
哈希代码

Long
必须将8个字节映射到4个字节(int
的大小)。
Long.hashCode()
的当前实现仅会返回
i
,如果它适合
int
,否则它将与较高的32位(4字节)异或:

双精度的哈希代码

显然,
double
double
值不符合此条件
Double
还必须将8个字节映射到4个字节

Double.hashCode()
将返回一个看似随机的值,因为浮点数(
float
Double
)没有“很好地”存储在为它们保留的字节中(例如2的补码,如
int
long
),而是使用and将这8个字节映射到4(这正是实现所做的)作为使用2的补码表示的
int
,将不是一个有意义的数字

long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));

因为
整数的
int
值完全满足并完全符合以下总合同:

hashCode的总合同为:

  • 在Java应用程序的执行过程中,每当在同一对象上多次调用hashCode方法时,hashCode方法必须一致地返回相同的整数,前提是在对象上的equals比较中使用的信息未被修改。该整数不必在应用程序的一次执行与另一次执行之间保持一致同样的应用程序

  • 如果根据equals(Object)方法两个对象相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果

  • 如果两个对象根据相等值(java.lang.Object)不相等,则不需要方法,然后对两个对象中的每一个调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能

简而言之:

如果
equals()
返回
true
,则两个对象的散列码必须相同,如果
equals()
返回
false
,则散列码应该不同(但不是必需的)
它必须是一个
int
。理想情况下,散列代码应该取决于散列的所有数据

长的
哈希代码

Long
必须将8个字节映射到4个字节(int的大小)。当前
Long.hashCode()
的实现只有在适合int的情况下才会返回
i
,否则将与较高的32位(4个字节)异或:

双精度的哈希代码

显然,
double
double
值不符合此条件。
double
还必须将8个字节映射到4个字节

Double.hashCode()
将返回一个看似随机的值,因为浮点数(
float
Double
)没有“很好地”存储在为它们保留的字节中(例如2的补码,如
int
long
),而是使用and将这8个字节映射到4(这正是实现所做的)作为使用2的补码表示的
int
,将不是一个有意义的数字

long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));

Java中的不同类型以不同的方式计算散列码,其中的非散列码是随机的
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
 Returns a hash code for this <code>Integer</code>.

 @return  a hash code value for this object, equal to the 
          primitive <code>int</code> value represented by this 
          <code>Integer</code> object. 

public int hashCode() {
return value;
}
    Returns a hash code for this Double object. The result is the exclusive OR 
    of the two halves of the long integer bit representation, exactly as produced by
    the  method  {@link #doubleToLongBits(double)}, of the primitive double value 
    represented by this Double object. That is, the hash code is the value of the
    expression:

        public int hashCode() {
        long bits = doubleToLongBits(value);
        return (int)(bits ^ (bits >>> 32));
        }