Java装箱拆箱之Integer和int的区别

面向对象的Java,为了编程的方便为每一个基本数据类型都引入了对应的包装类型,提供了拆箱和装箱的语法糖,而int的包装类就是Integer。

一、基本区别

Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。

二、其他区别

public static void main(String[] args) {
		int s=1;
		Integer aInteger =1;
		Integer bInteger =2;
		Integer cInteger =3;
		Integer dInteger =3;
		Integer eInteger =127;
		Integer fInteger =127;
		Integer integer = new Integer(2);
		Integer kinteger = new Integer(2);
		Integer m=128;
		Integer h=128;
		Long gLong = 3L;
		System.out.println(s==aInteger);//true
		System.out.println(s==integer);//false
		System.out.println(cInteger==dInteger);//true
		System.out.println(eInteger==fInteger);//true
		System.out.println(m==h);//false		
		System.out.println(integer==kinteger);//false
		System.out.println(cInteger==(aInteger+bInteger));//true
		System.out.println(cInteger.equals(aInteger+bInteger));//true
		System.out.println(gLong==(aInteger+bInteger));//true
		System.out.println(gLong.equals(aInteger+bInteger));//false
	}

(1)上面第一行和第的输出结果说明int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

(2)第四行和第五行同样的类型,一个是127和127的比较,一个是128和128的比较,一个返回true,而一个却返回false,这是什么现象?其实两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

(3)第六行结果返回false,是因为两个都是new出来的存放在堆中,比较的是内存地址,而内存地址不一样返回false。

(4)第七、八行结果都返回true,而九、十行的结果一个返回true,一个返回false,是因为包装类重写了equals方法,而非new的Integer常量则在常量池(在方法区),类型一样的可以直接比较值

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }










猜你喜欢

转载自blog.csdn.net/chenbingbing111/article/details/80085420