@Basil Bourque 的回答几乎涵盖了所有内容。但他留下了为什么要public static void hashCode(int)
添加的问题。
2012 年 11 月在此变更集中进行了更改
变更集的标题和摘要是这样说的:
7088913:将兼容的静态 hashCode(primitive) 添加到原始包装类
摘要:向每个原始包装类添加静态实用程序方法,以允许从未装箱的原始类型计算 hashCode 值。
请注意,变更集没有记录变更的动机。
我推断增强的一个目的是避免应用程序程序员必须知道原始包装类是如何计算的。在 Java 8 之前,要计算原始的包装兼容哈希码int
,程序员必须编写
int value = ...
int hash = ((Integer) value).hashCode(); // Facially inefficient (depending on
// JIT compiler's ability to get
// rid of the box/unbox sequence)
或者
int value = ...
int hash = value; // Hardwires knowledge of how
// Integer.hashCode() is computed.
虽然“知识”对于int
/Integer
来说是微不足道的,但考虑 / 的情况,double
其中Double
哈希码计算是:
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
似乎这个变更集也受到了 Streams 项目的推动。例如,Integer::hashCode
可以在整数流中使用。
但是,添加 和用于流减少的变更集发生在此之后的几个月。所以我们不能明确地建立联系……基于这个证据。sum
min
max