问题
public static void main(String[] args){
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
解决
public static void main(String[] args){
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // false
}
看到这里,一些小伙伴可能感觉,嘶,这不对吧,128和128咋还不一样呢,这不对吧这是,哈哈,其实这个是没问题的。
这个问题其实就涉及到Integer的源码底层了,我们看如下源码,这是Integer源码中的一个内部类,通过类名我们可以知道应该是一个类似缓存的类。
private static class IntegerCache {
// 最低数值
static final int low = -128;
// 最高数值
static final int high;
// 缓存cache数组
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数组的大小
cache = new Integer[high - -128 + 1];
var2 = -128;
// 将-128到127的数值放入cache数组
for(int var3 = 0; var3 < cache.length; ++var3) {
cache[var3] = new Integer(var2++);
}
assert high >= 127;
}
}
实际上,这段源码的主要意思大概就是,Integer设置了一个缓存区间cache数据,这个区间的大小是[-128,127]。所以当我们在调用 new Integer的时候,如果该值在这个区间内,Integer就会将该对象存储缓冲区,当再次创建该值时,会先去缓冲区获取;如果获取到就返回,如果没有获取到就创建该对象存入缓冲区并返回。