Integer和int的区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
先看下测试代码
public class TestInteger {
public static void main(String[] args) {
int a = 3;
int b = 3;
System.out.println("a与b是否相等?"+(a == b));//基本数据类型比较
Integer aa = 3;
System.out.println("a与aa是否相等?"+ (a == aa));//自动拆箱,比较基本数据类型
Integer bb = 3;//自动装箱
System.out.println("aa与bb是否相等?"+ (aa == bb));
Integer zz = 128;
Integer ww = 128;
System.out.println("zz与ww是否相等?"+ (zz == ww));
Integer qq = new Integer(3);
Integer pp = new Integer(3);
System.out.println("qq与pp是否相等?"+(qq == pp));
}
}
测试结果如下:
![](https://img.haomeiwen.com/i19530882/ee573666d98f0570.png)
反编译查看代码:
public class TestInteger
{
public static void main(String[] args) {
int a = 3;
int b = 3;
System.out.println("a与b是否相等?" + ((a == b) ? 1 : 0));
Integer aa = Integer.valueOf(3);
System.out.println("a与aa是否相等?" + ((a == aa.intValue()) ? 1 : 0));
Integer bb = Integer.valueOf(3);
System.out.println("aa与bb是否相等?" + ((aa == bb) ? 1 : 0));
Integer zz = Integer.valueOf(128);
Integer ww = Integer.valueOf(128);
System.out.println("zz与ww是否相等?" + ((zz == ww) ? 1 : 0));
Integer qq = new Integer(3);
Integer pp = new Integer(3);
System.out.println("qq与pp是否相等?" + ((qq == pp) ? 1 : 0));
}
}
1、a与b是否相等?两个基本数据类型比较,毋庸置疑结果为true
2、a与aa是否相等?Integer aa = 3; 编译后为Integer aa = Integer.valueOf(3);这就是基本数据类型的自动装箱。当aa和基础数据类型int a比较时,自动拆箱为 aa.intValue(),两个基本数据类型的比较。结果也为true
3、aa和bb是否相等?Integer bb = Integer.valueOf(3); 和 Integer aa = Integer.valueOf(3);比较。源码分析我们看下Integer.valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。比较结果为true
4、zz与ww是否相等? 128不在 -128到127区间范围内,第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。比较结果为false
5、qq与pp是否相等?这两个值虽然值都为3,但是我们都是通过 new 关键字来创建的两个对象,两个用new关键字创建的对象用 == 进行比较,结果当然为 false。
网友评论