繁体   English   中英

为什么 HashMap 不能有不同的 NaN 值作为键?

[英]Why can't HashMap have different NaN values as keys?

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      Map<Float, Integer> m = new HashMap<>();
      
      m.put(Float.intBitsToFloat(0x7f800001), 1);
      m.put(Float.intBitsToFloat(0x7f800002), 2);
      
      System.out.println(m.size());
    }
}

为什么上面的代码返回1作为m的大小? 0x7f8000010x7f800002都是 NaN 浮点值,但由于NaN != NaN根据定义,这不会导致冲突。

The behavior is similar to the documented handling of null keys in the Java Hashmap, but I can't find anything that indicates that NaN is handled as null by HashMap.

Float.equals(Object)记录为:

将此 object 与指定的 object 进行比较。 当且仅当参数不是 null 并且是Float object 时,结果才为真,该浮点数表示与此 object 表示的浮点数具有相同值的浮点数。 为此,当且仅当方法floatToIntBits(float)在应用于每个浮点值时返回相同的int值时,才认为两个浮点值相同。

现在听起来不同的 NaN 值应该被视为不相等,但floatToIntBits文档包括(强调我的):

如果参数为 NaN,则结果为 0x7fc00000。

在所有情况下,结果都是 integer,当将其提供给intBitsToFloat(int)方法时,将生成与floatToIntBits的参数相同的浮点值(除了所有 NaN 值都折叠为单个“规范”NaN 值) .

所以基本上, Float.equals (和Float.hashCode ,它也使用floatToIntBits(float) )将所有 NaN 值视为相等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM