Integer a = 100; Integer b = 100; Integer c = 200; Integer d = 200; System.out.println(a == b); //true System.out.println(c == d); //falseInteger是对象,==比较的是对象在内存中的物理地址,但是Integer有个缓存的概念, 符合规范的Java实现必须保证Integer的缓存至少要覆盖[-128, 127]的范围,查看源码:
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); }在这个scope之内的所有是相同的,超过这个scope就是从heap上重新new一个所以是不相同的 这个缓存在VM启动时是可以配置的