为什么最后输出ture和false?

图片说明

调用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。