面试期间问了Integer和int之间各种情况的比较,发现有不确定的,然后试验了所有情况,整理如下代码,如有问题请指出。
public static void main(String[] args) {
Integer a = 1;//默认调用valueOf 装箱 会使用缓存
Integer b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);
Integer e = Integer.parseInt("1");//parseInt返回的是int类型,赋值给Integer后会装箱
Integer f = Integer.parseInt("1");
int g = 1;
int h = 1;
//equals方法都是进行拆箱,所以都是值比较
//int和Integer比较都会将Integer拆箱,拆箱后比较值
//超出-128~127的结果会改变的加**********
System.out.println(a == b);// true 都为缓存中的一个对象 **********
System.out.println(c == d);// false 两个对象
System.out.println(e == f);// true 都是int的装箱,e、f指向的都是缓存中的地址 **********
System.out.println(g == h);// true 值相等
System.out.println(a == c);// false a为缓存中的对象,c为新对象
System.out.println(a == e);// true e的后边返回int,a 和 e 后面的值都做了装箱,都为缓存地址 **********
System.out.println(a == g);// true a拆箱
System.out.println(c == e);// false e的后面返回int,然后调用valueOf装箱,为缓存中的地址,c为新地址
System.out.println(c == g);// true c拆箱
System.out.println(e == g);// true e拆箱
}
拆箱可能会导致空指针,代码如下:
//拆箱可以导致空指针
Integer i = (Integer)null;
int ii = 1;
System.out.println(i == ii );