面试期间问了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 );