先来看道题
int a=100;
int b=100;
Integer c=a;
Integer d=b;
System.out.println(a==b);
System.out.println(c==d);
其实这道题 和 a 与 b 没有什么关系,可以直接看成
Integer c=100;
Integer d=100;
System.out.println(c==d);
执行结果为 true
当是如果把题目改为
Integer c=200;
Integer d=200;
System.out.println(c==d);
执行结果却为false
这是为什么呢?
这就涉及到 Integer 的自动装箱了,
我们都知道Integer是一个 类 不是基本类型数据,但是为什么它可以直接像基本类型数据一样可以直接赋值.
这是在jdk1.5 之后引入的 自动装箱和自动拆箱.
上面的问题实际上是使用了 Integer.valueOf()进行自动装箱的.
等同于
Integer c=Integer.valueOf(100);
对于为什么上面两个问题的执行结果会有不同,我们就需要看 Integer.valueOf()的源码了
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache.high和IntegerCache.low默认分别为 127 和-128
如果传入的值是在-128~127之间就会建立Integer实例并且把实例放入缓存中,
当再传入的值是缓存中存在的,就会把缓存中的实例返回.
如果不在 -128~127之间就不会把 实例放入缓存中.直接返回一个实例.
内容部分参考java jdk7 学习笔记