- public static void main(String[] args) {
- Integer a=200 ;
- Integer b=200 ;
- int c= 200 ;
- System.out.println("a==c " +(a==c));
- System.out.println("b==c " +(b==c));
- System.out.println("a==b " +(a==b));
- }
请问LZ,对于这段代码的运行结果是:
- a==c true
- b==c true
- a==b false
既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢?
我绝对大家要学会看.class文件
Integer a=200;
int c=200;
System.out.println("a==c");
被编译器这样编译:
Integer a=Integer.valueOf(200); 这个时候引用a存储的是堆栈中Integer对象的地址 (注意a是对象引用)
int c=200; 编译器把常量200写进常量池,然后栈中的变量c里面存放的就是这个值200 (注意c是变量名)
int temp=a.intValue(); 大家可以去看看intValue()的源代码,实际上编译器并没有temp这样的变量,而直接把intValue()的返回结构压入操作数栈。我这些写实为了大家明白过程(不存在temp的).
System.out.println(temp==c);
大致的过程就是这样
总结一下:
(1) 当把一个整形常量或变量直接赋值给Integer引用时,比如 Integer a=200, 或 int b=200; Integer a=b;
这是编译器会调用Integer.valueOf()方法来自动打包int基本类型。
(2) 当比较一个Integer对象和一个int基本类型变量的时候,编译器会调用Integer对象.intValue()将Integer对象自动拆包,然后比较两个整形变量。
注意编译器给我们做了很多工作,大家不要忘记了他的辛苦。要把它的汗水记得明明白白它的心!!