关于int,Integer 以及Integer.valueOf()的一点儿见解

今天遇到了关于比较由int,Integer 以及 Integer.valueOf()修饰的数值的比较问题,小小的总结一下。

int 和 Integer 的关系:

  • int 是基本数据类型的一种,而Integer是其包装类,从 int 到 Integer 称为装箱,反之,称为拆箱。为基本数据类型提供包装类的原因,我想是让基本数据类型的应用范围更为广泛吧,比如在用到泛型时,基本数据类型需要装箱才可使用。
  • Integer.valueOf()是Integer类的一个静态方法,当括号中的变量值在-128~127之间时,其不会创建对象。而是指向现有的自动装箱的对象。如果没有其会自己创建一个。

关于int, Integer 以及 Integer.valueOf() 变量之间的比较,我使用 127 和 128进行了测试,结果如下

127:

int i1 = 127;
Integer i2 = 127;
Integer i3 = new Integer(127);
Integer i4 = new Integer(127);
Integer i5 = Integer.valueOf(127);
Integer i6 = Integer.valueOf(127);
System.out.println(i1 == i2); // true i1和i2比较时,i2会自动拆箱, 因此是相等的
System.out.println(i2 == i3); // false 而i2和i3是两个不同的对象,因此不等
System.out.println(i3 == i4); // false 不等
System.out.println(i5 == i6); // true 相等 且 与 i2 相等
System.out.println(i1 == i3); // true int 和 Integer类型比较时,Integer总会自动拆箱
System.out.println(i1 == i4); // true
System.out.println(i1 == i5); // true
System.out.println(i1 == i6); // true 

在这里插入图片描述
如果将上述代码去掉Integer i2 = 127;其内存变换如下:
在这里插入图片描述
可以看出i5自己重新生成了一个对象

128:

int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
Integer i5 = Integer.valueOf(128);
Integer i6 = Integer.valueOf(128);
System.out.println(i1 == i2); // true i1和i2比较时,i2会自动拆箱, 因此是相等的
System.out.println(i2 == i3); // false 而i2和i3是两个不同的对象,因此不等
System.out.println(i3 == i4); // false 不等
System.out.println(i5 == i2); // false i5会重新创建一个对象
System.out.println(i5 == i6); // false i6会重新创建一个对象
System.out.println(i1 == i3); // true
System.out.println(i1 == i4); // true
System.out.println(i1 == i5); // true
System.out.println(i1 == i6); // true

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41055558/article/details/89424674