包装类与基本数据类型
包装类是将基本数据类型封装成一个类,包含属性和名称
使用:
在使用过程中,会涉及到自动装箱和自动拆箱
装箱:
将基本数据类型转换成包装类
Integer i = Integer.valueOf(a);//装箱
拆箱:
将包装类转换成基本数据类型
int i2 = b.intValue();//拆箱
普通类型比较
int1 == integer1,Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。
private static void intCompare(){
int int1 = 128;
Integer integer1 = 128;
Integer integer2 = Integer.valueOf(128);
Integer integer3 = new Integer(128);
System.out.println(int1==integer1); //true 拆箱后值比较
System.out.println(int1 == integer2); //true
System.out.println(int1 == integer3); //true
}
包装类型比较
Integer比较的是内存地址,不会经历拆箱过程。
当时在-128到127范围内,有IntegerCache缓存,所以对象是一样的
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在-128-127范围内,不重复创建对象
private static void integerCompare(){
Integer integer1 = 127; // 等价于Integer.valueOf(127);
Integer integer2 = Integer.valueOf(127); //从缓存中读取
Integer integer3 = new Integer(127);
System.out.println(integer1==integer1); //true
System.out.println(integer1 == integer3); //false
System.out.println(integer2 == integer3); //false
}
超过127,每次都创建新的Integer对象
private static void integerCompare2(){
Integer integer1 = 128 ;// 等价于Integer.valueOf(128);
Integer integer2 = Integer.valueOf(128);
Integer integer3 = new Integer(128);
System.out.println(integer1==integer2); //false
System.out.println(integer1 == integer3); //false
System.out.println(integer2 == integer3); //false
}