所以基本上我是在做一些研究,因为我很好奇是否可以做到,我发现了以下代码:
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws Exception {
Class cache = Integer.class.getDeclaredClasses()[0];
Field c = cache.getDeclaredField("cache");
c.setAccessible(true);
Integer[] array = (Integer[]) c.get(cache);
array[132] = array[133];
int n = 2+2;
System.out.println(n);
System.out.printf("%d",2 + 2);
}
}
我只是好奇为什么printf语句现在会返回5,而打印整数n会返回4。
1条答案
按热度按时间baubqpgj1#
java缓存256
Integer
表示从-128到127的数字的对象。当int
被绑在箱子里Integer
,如果其值介于-128和127之间,则Integer
将使用缓存中的对象(了解更多信息)。语言如何做到这一点是实现细节。在您的java版本中,它将这个缓存存储在Integer
,在Integer[]
调用的字段cache
. 在其他版本的java中,这可能会改变,因此您的代码可能会中断。代码的第一部分是获取整数缓存,并将索引132设置为与索引133相同。由于这个数组从-128开始,索引132将对应于其中4,索引133将对应于其中5。这意味着您已将缓存中的4替换为5。
对…的论点
printf
,2 + 2
,首先计算为4。然后它被装箱到一个Integer
. 这是因为printf
只接受Object
作为它的第二个参数。因为4在-128和127之间,所以使用缓存,并访问数组的索引132,因为这是Integer
如果你没有修改数组的话,应该是4。但是你修改了数组,所以改为5。另一方面,
println
仍然打印4因为println
有一个可以接受的重载int
所以那里没有拳击比赛。顺便说一句,你不是在修改“整数加法”,你只是在修改“整数装箱”。