如何在java中修改整数加法?

kwvwclae  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(332)

所以基本上我是在做一些研究,因为我很好奇是否可以做到,我发现了以下代码:

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。

baubqpgj

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 所以那里没有拳击比赛。
顺便说一句,你不是在修改“整数加法”,你只是在修改“整数装箱”。

相关问题