1 回答
TA貢獻1775條經驗 獲得超8個贊
首先,C 函數realloc不是可以增長數組的工具,而是以前通過、或分配malloccallocrealloc的內存。相反,C 數組可能位于堆棧或靜態內存區域,甚至可能嵌入更大的結構中。
然后,該函數具有使原始指針無效free并返回新指針的語義。所以如果你有指針的副本到處亂飛,你有責任用新指針替換所有出現的地方。
當然,Java 不支持無效引用。保證每個非null對象引用的有效性,是 Java 內存管理的基本屬性。
所以如果你想要 C's 的等價物realloc,你必須使用指針而不是數組。然后sun.misc.Unsafe有所有相關操作
public long allocateMemory(long bytes)public long reallocateMemory(long address, long bytes)public void freeMemory(long address)public float getXyz(long address)1public void putXyz(long address, xyz x)1
1 其中“xyz”代表原始類型
如果要調整數組大小,請使用
array = Arrays.copyOf(array, newSize);
這不會使舊引用失效,因此如果您無法替換對舊數組的所有引用,使用這些舊引用的代碼將訪問舊數組。
但是,如果array是對特定數組的唯一引用,或者您的代碼確實替換了所有現有引用,那么理論上JVM可能會啟用就地調整大小操作而不是復制內容,另請參見Does Java JIT cheat when running JDK code?
但是檢查必要的先決條件可能比復制數組內容更昂貴。我可以想象適用性的唯一場景是,如果數組是同一線程分配的最后一個對象,那么可以證明引用還沒有逃逸,并且在分配空間中數組后面沒有對象。
對于具有這種優化的 JVM,當重復添加到 時,您可能會自動獲得好處ArrayList,因為該類確保它是對其內部數組的引用的唯一持有者,并且它在Arrays.copyOf內部用于調整大小。
添加回答
舉報
