IdentityHashMap 与 HashMap 的区别在于,前者判断重复键是通过判断 “obj1 == obj2”,而后者是通过判断 “obj1.equals(obj2)”,即便知道这样,也需要我们注意下面的;
首先,我们要清楚
代码片段1:
Integer i1 = new Integer(1); Integer i2 = new Integer(1); System.out.println(i1 == i2);
运行上面的代码打印“false”;
代码片段2:
Integer i1 = 1; Integer i2 = 1; System.out.println(i1 == i2);
运行上面的代码打印“true”;
那么,如果用 IdentityHashMap 存储键值对,先后插入代码片段 2 中的 以 i1 为键的 entry 和以 i2 为键的 entry,就会出现后者覆盖前者的情况,那可能并不是我们想要的;
这个属于 Java 的遗留问题,比较隐蔽:https://stackoverflow.com/questions/2602636/why-cant-the-compiler-jvm-just-make-autoboxing-just-work;不用到这个类都不了解。大概就是,自动装箱会调用 Integer 的 valueOf 方法,-128到127的 Integer 对象会始终被缓存,像代码片段2那样赋值,i1 和 i2 指向同一个对象,那么后面的比较自然是返回 true,因为是比较对象的内存位置。在 Java 中也有类似的情况,例如字符串常量。
浙公网安备 33010602011771号