Integer a=100与Integer b=100比较为true,Integer a=300与Integer b =300比较为false
案例一:
Integer a = 100;
Integer b = 100;
System.out.println(a==b); // true
案例二:
Integer a = 300;
Integer b = 300;
System.out.println(a==b); // false
案例三:
int c = 100;
int d = 100;
System.out.println(c==d); // true
System.out.println(c=d); // 100
解析:
integer.class源码
public static Integer valueOf(int var0) {
return var0 >= -128 && var0 <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}
Integer类中有个内部类:IntegerCache ,这个类中有一个缓存数组cache[ ],存放的内容是-128到127的整数。Integer a = 100实际在内部做了Integer.valueOf(100),判断a的值是否在-128—127之间。如果在此区间,则返回a+128作为整型数组 cache的下标,放在缓存中。如果不在,则创建新的对象new Integer(a)
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer[] cache;
private IntegerCache() {
}
static {
int var0 = 127;
String var1 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
int var2;
if (var1 != null) {
try {
var2 = Integer.parseInt(var1);
var2 = Math.max(var2, 127);
var0 = Math.min(var2, 2147483518);
} catch (NumberFormatException var4) {
;
}
}
high = var0;
cache = new Integer[high - -128 + 1];
var2 = -128;
for(int var3 = 0; var3 < cache.length; ++var3) {
cache[var3] = new Integer(var2++);
}
assert high >= 127;
}
}
可以看到high本身没有值,是var0=127赋给它的,而var0的值在这之前可能会改变。也就是说缓存上限的127其实是可以改变,可以从VM这个java.lang.Integer.IntegerCache.high中读取为上限,但是需要满足这个上限的值确实在-128和127之间。也就是说缓存的容量其实是可以改变的。基于这个特点,如果缓存的容量在-128到127之间,那么我们为了使用内存数据的高效性,可以将范围内大小的Integer放在同一缓存数组中,而不在范围内的则不放在缓存数组中,这也就是为什么下面的ValueOf方法中需要断言assert high值>=127的原因。