有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java奇怪的包装器类行为==和=

Possible Duplicate:
Weird Java Boxing

最近,当我阅读包装器类时,我遇到了一个奇怪的情况:

Integer i1 = 1000;
Integer i2 = 1000;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");

其中打印:

different objects

Integer i1 = 10;
Integer i2 = 10;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");

其中打印:

same object

这个案子有什么合理的解释吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    对于第二种情况,==返回true的原因是包装器装箱的原语值足够小,可以在运行时保留为相同的值。因此他们是平等的

    在第一种情况下,Java的整数缓存不够大,无法包含数字1000,因此最终会创建两个不同的包装器对象,通过引用比较,结果返回false

    所述缓存的使用可以在Integer#valueOf(int)方法中找到(其中IntegerCache.high默认为127):

    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
    

    正如Amber所说,如果使用.equals(),那么这两种情况都将始终返回true,因为它会在必要时解除对它们的绑定,然后比较它们的原始值

  2. # 2 楼答案

    整数i1=1000

    编译器将其理解为int,这就是为什么i1 == i2 // return true

    但是,尽管i1i2是big==测试返回false

    Integer i1 = 10000000;
    Integer i2 = 10000000;
    
    if(i1 != i2) System.out.println("different objects"); // true
    
    if(i1 == i2) System.out.println("same object"); // false
    

    注意:

    Integer i1 = 100;
    Integer i2 = 100;
    
    System.out.println(i1 == i2); // true
    
    i1 = 1000000;
    i2 = 1000000;
    
    System.out.println(i1 == i2); // false
    

    对于对象,不要使用==测试相等性。它只是比较他们的参考.equal()检查两个对象是否相同

    Integer i1 = 1000000;
    Integer i2 = 1000000;
    
    i1 == i2 // false
    i1.equals(i2) // true
    
  3. # 3 楼答案

    我刚试过这个,它给我留下的只是

    different objects
    

    正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们碰巧包含相同的值

    正如Amber在上述评论中暗示的那样

    if(i1.equals(i2)) System.out.println("same value");
    

    真的会打印吗

    same value