代码如下:package basic;import java.lang.reflect.Field;public class TestField { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
@SuppressWarnings("rawtypes")
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache); newCache[132] = newCache[133];
int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b);
}
}运行结果如下:2 + 2 = 5为什么会有这样的输出结果呢?另外附上内部类IntgerCache的源码如下:
1 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
Java
中Integer
对-127到128的整形数据是有缓存的,你这里通过反射缓存中的第133号数据(既整数5)赋值给了第132号数据(既整数4),所以4就会变成5来表示。在使用int数据计算时结果是正常的,但是在打印时由于做了装箱,int数据变成了Integer,这时会采用缓存,所以4就会打印出5来。
添加回答
举报
0/150
提交
取消