VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  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 中也有类似的情况,例如字符串常量。

posted on 2019-08-04 22:04  bobo2018  阅读(327)  评论(0)    收藏  举报