Java Integer Cache
Java 代码
public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = 1;
int c = 1;
System.out.println(a == b);
System.out.println(a == c);
System.out.println(b == c);
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
运行结果
false
true
true
true
false
反编译代码
public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = Integer.valueOf(1);
int c = 1;
System.out.println(a == b);
System.out.println(a.intValue() == c);
System.out.println(b.intValue() == c);
Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(150);
Integer f4 = Integer.valueOf(150);
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
public class Test {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
}
}
运行结果
true
false
true
true
true
false
反编译代码
public class Test {
public static void main(String[] args) {
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.intValue() == a.intValue() + b.intValue());
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == a.intValue() + b.intValue());
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
}
}
解析 1、Byte,Short,Integer,Long 的缓存范围为[-128,127],Character 的缓存范围为[0,127]。 2、int 和 int 之间用 == 比较,肯定为 true。另外基本数据类型没有 equals 方法。 3、int 和 Integer 之间比较,Integer 会自动拆箱,== 和 equals 肯定都为 true。 4、int 和 new Integer 之间比较,Integer 会自动拆箱,调用 intValue 方法,所以 == 和 equals 肯定都为 true。 5、Integer 和 Integer 之间比较的时候,由于直接赋值的话会进行自动装箱。所以当值在[-128,127] 中的时候,由于值缓存在 IntegerCache 中,那么当赋值在这个区间的时候,不会创建新的 Integer 对象,而是直接从缓存中获取已经创建好的 Integer 对象。而当大于这个区间的时候,会直接 new Integer。 6、当 Integer 和 Integer 之间进行 == 比较的时候,在[-128,127] 区间的时候,为 true。不在这个区间,则为 false。 7、当 Integer 和 Integer 之间进行 equals 比较的时候,由于 Integer 的 equals 方法进行了重写,比较的是内容,所以为 true。 8、Integer 和 new Integer 之间比较:new Integer 会创建对象,存储在堆中。而 Integer 在[-128,127] 中,从缓存中取,否则会 new Integer。所以 Integer 和 new Integer 进行 == 比较的话,肯定为 false ;Integer 和 new Integer 进行 equals 比较的话,肯定为 true。 9、new Integer 和 new Integer 进行 == 比较的时候,肯定为 false ;进行 equals 比较的时候,肯定为 true。原因是 new 的时候,会在堆中创建对象,分配的地址不同,== 比较的是内存地址,所以肯定不同。 10、装箱过程是通过调用包装类的 valueOf 方法实现的。 11、拆箱过程是通过调用包装类的 xxxValue 方法实现的(xxx 表示对应的基本数据类型)。
参考资料