JAVA中对象包装器Wrapper与相应的类型相等判断

前言:本文解决的问题

  • 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){//这里相等
}

猜你喜欢

转载自www.cnblogs.com/java-learner/p/9656603.html
今日推荐