簡體   English   中英

如何修改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 語句現在會返回 5,但打印整數 n 仍然會給我 4。

Java 緩存了 256 個Integer對象,表示從 -128 到 127 的數字。當int被裝箱為Integer ,如果它的值在 -128 到 127 之間,則將使用緩存中的Integer對象。 在此處了解更多信息)。 語言如何做到這一點是實現細節。 在您的 Java 版本中,它將此緩存存儲在Integer的內部類中,位於名為cacheInteger[]字段中。 在某些其他版本的 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的重載,所以沒有裝箱發生。

順便說一句,你不是在修改“整數加法”,你只是在修改“整數裝箱”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM