1 回答

TA貢獻1775條經驗 獲得超8個贊
首先,C 函數realloc
不是可以增長數組的工具,而是以前通過、或分配malloc
calloc
realloc
的內存。相反,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
內部用于調整大小。
添加回答
舉報