int a = 2;
int b = a + a;
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache);
newCache[132] = newCache[133];
System.out.printf("%d",b); // 5
System.out.println(b); // 4
Run Code Online (Sandbox Code Playgroud)
在这里,我改变的值cache[132]到cache[133]现在,这意味着cache[132] == 5
在printf()方法它打印5罚款,但println()为什么它打印4应该是5就可以了什么是背后的原因?
println有一个过载接受一个int.因此在行
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
将int永远不会转换的到Object使用Integer.valueOf.
printf 有签名
public PrintStream printf(String format, Object ... args)
Run Code Online (Sandbox Code Playgroud)
所以4被自动装箱到Integer对象5(使用修改的缓存),因此5被打印.