注意不要混淆「對象」本身就是一個「參考」到「對象」:
例如,下面的代碼創建一個(空)參考,但沒有創建對象。
Object a = null;
下面的代碼創建boths一個對象,並對該對象的引用(參考在名爲「A」的變量持有):
Object a = new Object();
下面的代碼創建新對象和「重新指向'一個存在的(引用)變量指向新的對象:如果變量'a'已經擁有另一個引用,'a'會將其放大。 [但這並不意味着其他變量可能仍然指向由'a'引用的舊對象]。
a = new Object(); // it is the reference 'a' that is 're-used' here not the object...
每次你在你的循環中重新運行上述語句時,你的確在創造一個新的對象;而且你正在重新指向那個新對象。
以前的參考文獻(即'a'中的參考文獻)每次都會被遺忘;和(假設我們這裏有一個單線程程序),這意味着它指向的對象將具有零引用指向它:這意味着該對象符合垃圾收集條件。這個垃圾收集是否在這個時候發生 - 我不知道我害怕。
但我會說:在垃圾收集發生的時候,您的編碼示例沒有區別;不管'指針類型'是否已經在循環外部定義爲'對象',或者在循環內重複定義。
以下(無用)的例子也許有助於說明之間的區別「創建-AN-對象」和「點一個引用的行爲,代碼將一氣呵成:
// This creates an object ; but we don't hold a reference to it.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
new Object();
}
}
}
而對於對比:
// This creates a reference ; but no object is created
// This is identical to setting the reference to 'null'.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
Object o;
}
}
}
由於字符串池,字符串文字不是最好的例子。同樣,你的例子在每個循環迭代中創建「新實例」。 – Pshemo
好吧,現在我不想那麼說了,那麼套件和列表又如何呢?如果我在循環內部或外部循環中創建Set對象,會有什麼區別? –
它們是對象,就像字符串。從這個角度來看,他們的表現完全一樣。 – Zavior