3 回答

TA貢獻1788條經(jīng)驗 獲得超4個贊
我不確定為什么會發(fā)生什么
您正在創(chuàng)建另一個數(shù)組,為其他元素提供更多空間。數(shù)組在 Java 中具有固定大??;一旦創(chuàng)建,就無法更改。在這里,新數(shù)組的長度是舊數(shù)組的兩倍。然后一個簡單的for循環(huán)復(fù)制元素引用。
這是否意味著 theItems 的大小也翻了一番?
不,數(shù)組引用theItems被重新分配給剛創(chuàng)建的新的、更大的數(shù)組。
我們不能在不使用 temp 的情況下將 theItems 的大小加倍嗎?
您可以只theItems用一個新數(shù)組替換,但隨后您就丟失了對包含要保留的所有項目的原始數(shù)組的引用,因此這沒有用。
這是發(fā)生的事情:
初始條件。
theItems -> ["one", "two", "three"]
已創(chuàng)建新陣列。
theItems -> ["one", "two", "three"]
temp -> [null , null , null , null, null, null]
已復(fù)制項目。
theItems -> ["one", "two", "three"]
temp -> ["one", "two", "three", null, null, null]
變量theItems被重新分配。
theItems \ ["one", "two", "three"] <- will be garbage collected.
|
temp --+> ["one", "two", "three", null, null, null]
該變量temp將超出范圍,但theItems仍會引用新數(shù)組。

TA貢獻1942條經(jīng)驗 獲得超3個贊
String[] temp = new String[theItems.length*2];創(chuàng)建Array兩倍大小的theItems. 所以說如果theItems是{"Hello", "Hi", "Goodbye", "Bye"}我們就會有
__ __ __ __ __ __ __ __
作為temp。然后
for(int i=0; i<noOfItems; i++){
temp[i]=theItems[i];
}
將項目復(fù)制到temp. 所以我們會有:
"Hello", "Hi", "Goodbye", "Bye" __ __ __ __
(最后四個空格)
然后theItems=temp;賦值theItems給temp. 這樣,變量theItems將有四個空格,并且可以向其中添加更多項。
請注意,Arrays該類已經(jīng)內(nèi)置了一個函數(shù)來執(zhí)行此操作:Arrays.copyOf

TA貢獻1810條經(jīng)驗 獲得超4個贊
最后要回答你的問題,你可以使用像注釋演示的輔助方法,但在某處,必須創(chuàng)建一個單獨的新數(shù)組并復(fù)制所有項目。
數(shù)組是一種固定大小的構(gòu)造——一旦你創(chuàng)建了一個,你就不能就地變大或變小。創(chuàng)建數(shù)組時,Java 堆的一部分(這是存儲對象的內(nèi)存區(qū)域的術(shù)語)等于一項的大?。ㄔ诒纠袨閷ψ址囊茫┏艘詳?shù)組的長度保留,并且對該內(nèi)存的引用分配給您在語句左側(cè)指定的變量,如String[] items = new String[10]
.
因此,要items
變大,您必須創(chuàng)建一個所需大小的新數(shù)組,按順序復(fù)制所有現(xiàn)有項目,然后將保存較小數(shù)組的變量重新分配給較大數(shù)組的引用,此時保存在temp
. items = temp;
簡單地將引用復(fù)制到items
soitems
并temp
引用相同的數(shù)組。然后當(dāng)方法結(jié)束時,items
保留 whiletemp
被刪除。
此外,由于現(xiàn)在有一個items
沒有變量引用的數(shù)組(之前提到的),Java 將在其垃圾收集周期中負(fù)責(zé)清理舊數(shù)組。但是,您不必?fù)?dān)心數(shù)組中的項目會消失,因為您將它們的引用復(fù)制到新數(shù)組中。
添加回答
舉報