public class IntegerDemo {
public static void main(String[] args) {
Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println("-----------");
Integer i3 = 127;
Integer i4 = 127;
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
System.out.println("-----------");
int k = 127;
System.out.println(k == i3);
int kk = 128;
System.out.println(kk == i1);
System.out.println("-----------");
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n);
}
}
大家可以先思考一下结果是什么?
下面慢慢介绍。
1.Interger和int的区别
1.Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)
2.Integer 是类,默认值为null,int是基本数据类型,默认值为0;
3.Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。
在使用时,Integer x = null;代码就会出现NullPointerException。只要是对象,建议先判断是否为null,然后再使用。
2.Interger的自动拆箱和装箱
自动拆箱:把包装类类型转换为基本类型
自动装箱:把基本类型转换为包装类类型
// 定义了一个int类型的包装类类型变量i
// Integer i = new Integer(100);
Integer ii = 100;
ii += 200;
System.out.println("ii:" + ii);
// 通过反编译后的代码
// Integer ii = Integer.valueOf(100); //自动装箱
// ii = Integer.valueOf(ii.intValue() + 200); //自动拆箱,再自动装箱
// System.out.println((new StringBuilder("ii:")).append(ii).toString())
3.回顾开头的问题、
public class IntegerDemo {
public static void main(String[] args) {
// Integer i1 = Integer.valueOf(128);
Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
System.out.println("-----------");
Integer i3 = 127;
Integer i4 = 127;
System.out.println(i3 == i4);//true
System.out.println(i3.equals(i4));//true
System.out.println("-----------");
int k = 127;
System.out.println(k == i3);//true
int kk = 128;
System.out.println(kk == i1);//true
System.out.println("-----------");
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n); //false
}
}
首先,直接声明Integer i1= 128,会自动装箱变为Integer i1= Integer.valueOf(128);Integer i 会自动拆箱为 i.intValue()。
1)对于i1.equals(i2)这里用equals比较的是值,那么结果肯定为true。
2)为什么i3 == i4会打印true呢?为什么 i1== 12会打印false?我们进入到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 >= IntegerCache.low && i <= IntegerCache.high),第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i3.i4都等于127 在缓存表示范围内,所以为 true。而i1,i2为128不在表示范围内,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false
3)对于k == i3,==比较符又将右边的自动拆箱,因此它们比较的是数值是否相等,比较两个基本数据类型,结果当然为true。
4)对于kk == i1,解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。
5)对于m == n,因为这个虽然值为10,但是我们都是通过 new 关键字来创建的两个对象,是不存在缓存的概念的。两个用new关键字创建的对象用 == 进行比较,结果当然为 false。