这里输出不同的原因是什么?

New*_*mit 10 java

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] == 5printf()方法它打印5罚款,但println()为什么它打印4应该是5就可以了什么是背后的原因?

Pau*_*ton 6

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被打印.