代码之家  ›  专栏  ›  技术社区  ›  user2622016

Java,整数不是唯一的,但它们在集合中是如何比较的?

  •  -1
  • user2622016  · 技术社区  · 11 年前

    我使用了这种直截了当的方法:

        Collection<Integer> aCollection = Arrays.asList(1,2,3,4,5,6);
        Integer a = new Integer(5);
    
        if( aCollection.contains(a) )
            System.out.println("aCollection contains 5");
    

    结果是“a集合包含5”。整数在整个系统中不是唯一的对象,但在这种情况下是 Collection<Integer> 以及 new Integer(5) 实际上引用了同一个对象? 我可以放心地假设任何集合在调用时都会这样做吗 .contains() ?

    我不确定,因为在比较引用和值时 == 结果是:

    3 == new Integer(3)
    new Integer(3) != new Integer(3)
    new Integer(3) == 3
    
    4 回复  |  直到 11 年前
        1
  •  5
  •   jlordo    11 年前

    contains 不通过引用进行比较。 new Integer(50000) 与另一个呼叫不同 新整数(50000) 然而 firstInt.equals(new Integer(50000)) 将返回true,因此contains将起作用。我使用较高的数字,因为实习可能发生在较低的数字上。

    0-127在进行拳击比赛时将被放入固定池中 但在显式创建新对象时不会 因此,您将对相同的值有相同的引用,但除此之外,您不能保证任何内部操作,并且对于相同的值,引用可能是对不同Integer对象的引用。 Integer.valueOf( 将尝试在适当的地方实习,即始终在 [-128, 128) 并且没有针对或反对在该范围之外实习的规范。

    我可以放心地假设任何集合在调用时都会这样做吗 .contains() ?

    你可以假设 .contains(Object o) 将返回 true 当且仅当 集合的一个或多个成员满足 thatmember.equals(o) ,或者如果 o 为null,并且至少有一个 null 成员

    技术上:

    退换商品 真实的 如果此集合包含指定的元素。更多 正式地,返回 真实的 当且仅当此集合包含 至少一个元素e,使得 (o==null ? e==null : o.equals(e)) .

        2
  •  1
  •   jlordo    11 年前

    它在中定义 JavaDoc :

    boolean contains(Object o)
    

    退换商品 true 如果此集合包含指定的元素。更多 正式地,返回 真实的 当且仅当此集合包含 至少一个元素e,使得 (o==null ? e==null : o.equals(e)) .

    大写:如果 o null ,包含将返回 真实的 如果集合包含 无效的 元素,否则它将返回 真实的 当且仅当存在一个元素 equals() 你正在寻找的那个。

    每次呼叫 new Integer(5) 将返回不同的引用,但根据 equals() method of the Integer class :

    将此对象与指定的对象进行比较。结果是 真实的 如果 并且只有当论点不是 无效的 并且是 整数 反对 包含相同的 int 值作为此对象。

        3
  •  0
  •   Abhishek Singh    11 年前

    .contains() 的调用 .equals() 方法内部。

    在您的情况下,您使用的是Integer对象。在您列出的所有情况下,Integer对象.equals()都可能返回true。

    然而,对于自定义对象,例如Person,情况可能并非如此。

    现在收藏

    Collection<Person> aCollection = Arrays.asList(b,c,d);
        Person a = new Person("Abhishek");
    

    可能返回false。因为您没有重写Person类中的.equals()方法

        4
  •  0
  •   Prabhakaran Ramaswamy    11 年前

    Autoboxing是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为double,依此类推。如果转换方向相反,则称为取消装箱。

    http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html