关于 Integer 和 int 的 ==

分析

自动装箱,会调用 Integer.valueOf(128) 方法,但是 128 超出了 [-128, 127] 的缓存范围,所以缓存没命中,创建出来的是两个不同的对象,所以输出是 false;

private static void test6() {

    Integer a = 128;
    Integer b = 128;

    System.out.println(a == b);  // false
}

分析

自动装箱,会调用 Integer.valueOf(127) 方法, 127 在 [-128, 127] 的缓存范围,所以缓存命中,创建出来的是两个相同的对象,所以输出是 true;

private static void test5() {

    Integer a = 127;
    Integer b = 127;

    System.out.println(a == b);  // true
}

分析

new Integer(10) 的话,没有调用 Integer.valueOf(10),不会利用缓存,所以每次 new 出来的都是新对象,所以输出是 false;

private static void test4() {

    Integer a = new Integer(10);
    Integer b = new Integer(10);

    System.out.println(a == b); // false
}

分析

Integer b = 10 其实会调用 new Integer(10),还是相当于调用了两次 new Integer(10),创建了两个对象,所以输出是 false;

private static void test3() {

    Integer a = new Integer(10);
    Integer b = 10;

    System.out.println(a == b); // false
}

分析

a 和 b 在 == 的时候,b 会自动拆箱,所以是基本类型之间的 ==,比的是数值,所以输出是 true;

private static void test2() {

    int a = 10;
    Integer b = new Integer(10);

    System.out.println(a == b); // true
}

分析

Integer i2 = 10 是自动装箱,会调用 Integer.valueOf(10),但 i1 和 i2 在比较的时候,i2 会自动拆箱,变成基本类型的比较,是数值的比较,所以是 true;

private static void test1() {

    int i1 = 10;
    Integer i2 = 10;

    System.out.println(i1 == i2); // true
}

你可能感兴趣的:(关于 Integer 和 int 的 ==)