我正在考虑使用 Double 作为 HashMap 的键,但我知道浮点比较是不安全的,这让我开始思考。 Double 类上的 equals 方法也不安全吗?如果是,则意味着 hashCode 方法也可能不正确。这意味着使用 Double 作为 HashMap 的键将导致不可预测的行为。
有人可以在这里证实我的猜测吗?
简短回答:不要这样做
长答案:以下是密钥的计算方式:
实际的密钥将是java.lang.Double
对象,因为键必须是对象。这是它的hashCode()
method:
public int hashCode() {
long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
The doubleToLongBits()
方法基本上采用 8 个字节并表示它们很长。因此,这意味着 double 计算中的微小变化可能意味着很大,并且您将有关键的失误。
如果您可以满足点后给定数量的点数 - 乘以 10^(点后的位数)并转换为 int (例如 - 对于 2 位数字乘以 100)。
会安全很多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)