如何修改java中的整数加法?
How to modify integer addition in java?
所以基本上我在做一些研究,因为我很好奇它是否可以完成,我找到了这段代码:
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 语句现在 return 5,但打印整数 n 仍然会给我 4。
Java 缓存 256 个 Integer
对象,表示从 -128 到 127 的数字。当 int
装箱到 Integer
时,如果它的值介于 - 128 和 127,将使用缓存中的 Integer
对象。 (Learn more here)。语言如何做到这一点是实现细节。在您的 Java 版本中,它将此缓存存储在 Integer
的内部 class 中,在名为 cache
的 Integer[]
字段中。在某些其他版本的 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
的重载,所以那里没有装箱。
对了,你不是在修改“整数加法”,你只是在修改“整数装箱”。
所以基本上我在做一些研究,因为我很好奇它是否可以完成,我找到了这段代码:
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 语句现在 return 5,但打印整数 n 仍然会给我 4。
Java 缓存 256 个 Integer
对象,表示从 -128 到 127 的数字。当 int
装箱到 Integer
时,如果它的值介于 - 128 和 127,将使用缓存中的 Integer
对象。 (Learn more here)。语言如何做到这一点是实现细节。在您的 Java 版本中,它将此缓存存储在 Integer
的内部 class 中,在名为 cache
的 Integer[]
字段中。在某些其他版本的 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
的重载,所以那里没有装箱。
对了,你不是在修改“整数加法”,你只是在修改“整数装箱”。