我想最近更熟悉java。我發現了一個問題,我無法在網上找到答案。我想知道什麼時候java向arraylist添加元素,是與變量名稱關聯的添加元素?例如在下面的代碼中:Java,如何添加到數組列表工作
E obj1 = new E();
E obj2 = new E();
List myList = new ArrayList<E>();
myList.add(obj1);
obj1 = obj2;
對obj1的新賦值後,myList的值是否會存在?
我想最近更熟悉java。我發現了一個問題,我無法在網上找到答案。我想知道什麼時候java向arraylist添加元素,是與變量名稱關聯的添加元素?例如在下面的代碼中:Java,如何添加到數組列表工作
E obj1 = new E();
E obj2 = new E();
List myList = new ArrayList<E>();
myList.add(obj1);
obj1 = obj2;
對obj1的新賦值後,myList的值是否會存在?
沒有,添加對象的List
時,該參考複製,因此,當你用新的值賦給obj1
,該列表將包含舊的。
除了動態擴展功能外,ArrayList與Array相同。
ArrayList是容器,內部它有一個內部的數組,它存儲對象引用。
myList.add(obj1);
這將存儲參考值不引用列出。
obj1 = obj2;
這將不影響列表中的任何更改。
obj1 = obj2;
之後,因爲obj1和obj2都指向同一實例(來自第2行E obj2 = new E();
),所以對象E的第一個實例被銷燬。
Java總是通過值。這意味着在你傳遞它之前的原始變量永遠不會被你調用的方法/對象/ etc內的任何東西所改變。
然而,讓人困惑的事情是,當你傳遞一個對象時,你實際上是通過值傳遞了對該對象的引用。
這是什麼給你這裏的行爲。
您已將對該對象的引用傳遞到列表中。參考文獻已被傳遞。這意味着它已被複制,並且可以根據需要更改引用(但不是它指向的內容),並且您調用的方法不會看到任何更改。
不,你的情況obj1不會在ArrayList中改變,因爲在將obj1更改爲obj2之前,您已經將obj1添加到ArrayList。
在Java中,它是「所有關於引用」。
創建新實例只有當您使用new
時。
在所有其他分配中,例如obj1 = obj2
,您只是將參考更改爲實際實例。
此規則的唯一例外是涉及基本類型的分配,例如char
和int
。
當您做myList.add(obj1)
時,您在myList
中添加一個條目,其中包含對obj1
引用的實例的引用。
此時,此實例有兩個引用(一個是obj1
,另一個是myList
中的條目)。
當你做obj1 = obj2
時,同一個實例只剩下一個參考(在myList
中)。
當對某個實例的引用數量變爲0時,它將被垃圾收集器刪除。
在回答這個問題之前,首先要記住的是,每當遇到物體被分配給另一個物體時,您需要考慮引用就像是對物體的遠程控制。但萬一對象被分配給另一個對象,你的引用(遠程控制)不再控制你的obj。
讓去逐行看發生了什麼:
E obj1 = new E();
// the obj1 is created and holds reference to a memory location let's say 1a2s3d
E obj2 = new E();
// the obj2 is created and holds reference to say 5g5g5g5 .
List myList = new ArrayList<E>();
// empty list created acception elements of type E
myList.add(obj1);
//myList now points to reference 1a2s3d by addition of obj1 .
obj1 = obj2
//obj1 and obj2 now point to same reference .. 5g5g5g5
and myList still points to reference 1a2s3d because it points to reference not obj1.
So its value will not change.
Also any new changes to elements of obj1 or obj2 like setting value of any field in obj1 of class
E will change value of that field in obj2 also . thus the code is (obj1==obj2) ?? will return true.
obj1
包含的類E.當你的對象「添加」到要添加對它的引用列表的一個實例的引用所以名單知道誰是新朋友。
當製作obj1 = obj2
你改變OBJ1的值,而不是實例本身,使這兩個變量指向E.相同的實例
對象變量只是一個參考,所以你只是改變參考。因此,您創建的實例爲
E obj1 = new E();
是仍然活着,根本沒有改變。
通過進行對象變量的賦值,您將永遠不會更改對象本身,而是引用。
注意:如果一個實例仍然沒有被某個變量指向,那麼java的垃圾回收器將會刪除它。情況並非如此,因爲實例現在由列表指向。
你爲什麼不嘗試一下? –
你說得對,我很懶。 – Keyvanrm