调用Integer small = 100 会调用Integer的valueOf()方法,对于-128~127的数字,Integer会为这个值创建一个唯一的对象,使用的时候直接返回对应的对象,
源码:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
先看看 JDK处理 Integer的源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
默认IntegerCache.low 是-127,Integer.high是128,如果在这个区间内,他就会把变量i当做一个变量,放到内存中(常量池);但如果不在这个范围内,就会去new一个Integer对象(**所以不在这个范围内的会不一样**)
参考链接:http://blog.csdn.net/xiaojiesu/article/details/50215237
对你有帮助,,给个采纳 ..... ^.^。
首先这四个都是对象,对象的==比较,通常是比较的地址,而不是里面的值。但是就int而言 java有一个常量池的概念 范围在[-128,127],两边都包含。
所有当你的Integer 值在这个范围之内时,其实就是在常量池中区值,故small和small2比较时,会自动拆箱成int ,int会比较两值是否相等,所以返回了true.
你的big2,big3超出了常量池的范围,所以比较的是内存地址,两个对象内存地址肯定不一样,所以是FALSE。