Integer和int使用==进行比较大小时的坑


先看一个例子:

public static void main(String[] args) {
  int i1 = 128;
  Integer i2 = 128;
  Integer i3 = new Integer(128);
  System.out.println(i1 == i2);//true
  System.out.println(i1 == i3);//true
  System.out.println("**************************************");


  Integer i4 = 127;
  Integer i5 = 127;
  Integer i6 = 128;
  Integer i7 = 128;
  System.out.println(i4 == i5);//true
  System.out.println(i6 == i7);//false
  System.out.println("**************************************");


  Integer i8 = new Integer(127);
  Integer i9 = new Integer(127);
  System.out.println(i8 == i9);//false
  System.out.println(i8.equals(i9));//true
  System.out.println(i4 == i8);//false

}

/* Output:
  true
  true
**************************************
  true
  false
**************************************
  false
  true
  false
*/

解析:第5和第6行的结果都为true。因为Integer和int比较时,Integer会自动拆箱(jdk1.5以上)。

第12行结果为true,第13行结果为false。因为Java在编译的时候,Integer i4=127被编译成-->Integer i4 = Integer.valueOf(127);

查看JDK源码:

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之间的数,会进行缓存,Integer i6 = 127时,会将127进行缓存,下次再写Integer i7 = 127时,就会直接从缓存中取,就不会新new对象了。

i8、i9使用的是new,对象不一样,所以第17行结果为false,第18行结果为true,第19行为false。

总结:

1、Integer是int的包装类,int的初始值为0,Integer的初始值为null;

2、无论如何,Integer和new Integer()不会相等。不会经历拆箱过程,i8的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,使用== 比较都为false。

3、两个非new出来的Integer,使用==比较,如果在-128到127之间,则是true,否则为false;

4、两个都是new出来的Integer,==比较都为false。若要比较值是否相等,需使用equals()方法进行比较;

5、int和Integer(无论是否是new出来的)比较,都为true,因为Integer会自动拆箱为int再去比较;

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM