关于 new integer 和integer.valueOf() 和 int 的比较

有一个面试题:

求打印结果

public static void main(String[] args) {

        Integer a = new Integer(100);
        Integer b = 100;
        int c = 100;
        Integer d = new Integer(100);
        System.out.println(a == d);
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(b == c);
        System.out.println(c == d);


    }

首先看这几个的创建方式        Integer a = new Integer(100);
        Integer b = 100;
        int c = 100;
        Integer d = new Integer(100);
我来看一下字节码

         0: new           #2                  // class java/lang/Integer
         3: dup
         4: bipush        100
         6: invokespecial #3                  // Method java/lang/Integer."":(I)V
         9: astore_1
        10: bipush        100
        12: invokestatic  #4                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        15: astore_2
        16: bipush        100
        18: istore_3
        19: new           #2                  // class java/lang/Integer
        22: dup
        23: bipush        100
        25: invokespecial #3                  // Method java/lang/Integer."":(I)V
        28: astore        4

第一个对象 

Integer a = new Integer(100); 

这段的操作过程就是   1,为Integer的实例对象分配内存空间并将地址压入栈顶。2,将对象地址再一次压入栈顶。3,将常量压入栈中。4,调用对象的init 方法从栈顶取出参数和this引用实例化对象,放入栈帧的局部变量表。

第二个对象

Integer b = 100;

1,将常量压入栈中。2,调用Integer的静态方法valueOf()对对象进行初始化。3,将引用放入局部变量表。

关于对象的valueOf()方法中,如果传进的值在 -128~127之间的话,获取这个区间相同值得对象引用是同一个,只被创建一次,所以当两个相同的Integer a = X , Integer b = X。只要X在这个区间,a==b为true。

第三个对象

int c = 100;

就是将常量放入了局部变量表中

 

看完这个应该就知道比对结果了,栈对比结果时,就是操作数栈对局部常量表的数据进行值比较

a==b 就是两个对象的引用比较,可以理解为两个指向不同内存空间的指针在比较,结果肯定为false。

a==c 这就涉及基本数据类型和对应的包装类比较时对象自动拆箱,所以就是两个值得比较,结果为true。

b==c 原理同上。

你可能感兴趣的:(知识点总结)