代码之家  ›  专栏  ›  技术社区  ›  Tiny user825402

比较Java中的包装器类型

  •  3
  • Tiny user825402  · 技术社区  · 13 年前

    我有两个 java.util.List 如下所示。

    List<Long> items = new ArrayList<Long>(){{
       add(141L);
       add(142L);           
    }};
    
    List<Long> itemsExist = new ArrayList<Long>(){{
        add(123L);
        add(124L);
        add(125L);
        add(126L);
        add(127L);
        add(141L);
        add(142L);            
    }};
    

    我试图删除 List 命名的 items ,如果它们包含在 列表 命名的 ItemsExist 如下所示。

    Iterator<Long> itemsIterator = items.iterator();
    
    while(itemsIterator.hasNext())
    {
        Long item1=itemsIterator.next();
        Iterator<Long> itemsExistIterator = itemsExist.iterator();
    
        while(itemsExistIterator.hasNext())
        {               
            Long item2=itemsExistIterator.next();
            if(item1==item2)
            {
                itemsIterator.remove();
            }
        }
    }
    

    但是元素的去除( 141 142 )没有因为这种情况而发生 if(item1==item2) 实际上应该是 if(item1.equals(item2)) (我能理解 == equals() ).


    这可以通过下面一个非常简单的例子来模拟。

    Long a=new Long(5);
    Long b=new Long(5);
    System.out.println((a==b)+" : "+a.equals(b));
    

    这会返回 false true 分别地


    以下示例返回 真实的 在两次比较中。

    Long a=5L;
    Long b=5L;
    System.out.println((a==b)+" : "+a.equals(b));
    

    在这种情况下 a b 而且 似乎是开箱的主题,而其他例子似乎不是这样。怎样

    2 回复  |  直到 13 年前
        1
  •  8
  •   dcernahoschi    13 年前

    以下是java.lang.Long的部分源代码:

               private static class LongCache {
      544           private LongCache(){}
      545   
      546           static final Long cache[] = new Long[-(-128) + 127 + 1];
      547   
      548           static {
      549               for(int i = 0; i < cache.length; i++)
      550                   cache[i] = new Long(i - 128);
      551           }
      552       }
    
                public static Long valueOf(long l) {
      573           final int offset = 128;
      574           if (l >= -128 && l <= 127) { // will cache
      575               return LongCache.cache[(int)l + offset];
      576           }
      577           return new Long(l);
      578       }
    

    在我看来,Long类维护了一个 Long 介于-128和127之间的对象。因此,示例中的a和b变量指向同一个对象 长的 .

        2
  •  1
  •   Community Mohan Dere    8 年前

    就像 String pool java为-128到+127之间的整数值维护一个池。这个网站已经回答了类似的问题。请参阅 Why does the behavior of the Integer constant pool change at 127?

    简单地说,如果您将-128到+127范围内的整数指定为文字,它将从整数池中提取,并且每次使用相同的文字时都会返回相同的对象。

    如,

    Integer int1 = 123;
    Integer int2 = 123; // Get the same object from integer pool
    System.out.println(int1.equals(int2));
    System.out.println(int1== int2);
    

    上面的代码在这两种情况下都是正确的。

    如果使用创建对象 new 操作员,每次都会创建一个新对象,Integer池不会出现在图片中。 如,

    Integer int1 = new Integer(123);
    Integer int2 = new Integer(123); // Gets you a new object
    System.out.println(int1.equals(int2));
    System.out.println(int1== int2);
    

    equals 方法让你变得真实 == 检查会让你出错。 你可以在这里获得更多见解 http://www.devx.com/tips/Tip/42276