前言:本文解决的问题
- int a = 122; Integer b = new Integer(122); a==b?
JAVA为所有的基本类型了提供了一个相应的包装类Wrapper。包装类是不可改变的,一旦构造了,其值就不可以改变,这点跟String是一样的。平时可以把Integer对象直接赋给一个int值,这是由于编译器自动拆箱,这就给人造成一种假象,基本类型和对象包装器是一样的,但是真的一样吗?请看下面:
public class IntegerTest {
public static void main(String[] args) {
//int 与Integer对象是否相等
Integer a = 10;
int c = 10;
System.out.println(a==c);
Integer b = 10;
System.out.println(a==b);//(-128,127)IntegerCache的范围
int aa = 128;
Integer aaa = new Integer(aa);
int bb = 128;
Integer bbb = new Integer(bb);
System.out.println(aaa==bbb);
aaa--;
bbb--;
System.out.println(aaa==bbb);
}
}
猜猜结果?
输出
true true false true |
分析
int 与Integer运用相等符号,判断的是值是否相等,第一输出true; a和b这里就是应用了自动装箱autoBoxing,这里明明是不同的对象为什么相等呢?由于JAV会把经常出现的值包装到同一个类中,值的大小比必须在[-128,127]区间中,如果超过这个范围就不成立。因此aaa!=bbb。
当把aaa和bbb的值分别自减1,编译器将会自动插入一条装箱命令,然后进行自减运算,然后再将结果进行装箱,由于自减后为127再自动装箱规范要求的范围中,因此这两个值被包装为同一类,因此输出又是true了。
回答开头的问题,
int a = 122;
Integer b = new Integer(122);
If(a==b){//这里相等
}