[英]does the set method in ArrayList actually change in memory?
我有一個ArrayLists數組。 我正在使用名為“ al”的變量遍歷它們,並更改該arraylist的內容。 但是,我看到ArrayList的原始數組的內容已更改。 為什么是這樣?
我期待着,因為我只更改了一個名為“ al”的新變量的內容,所以ArrayLists的原始數組的內容(即alal)不會改變。
這些是直接在內存上運行的嗎? 如果我想閱讀更多有關此概念的內容,該概念稱為什么。
package proj;
import java.util.ArrayList;
public class Ask
{
public static void main(String[] args)
{
ArrayList<Integer> myArrayList1 = new ArrayList<Integer>();
myArrayList1.add(1);
myArrayList1.add(1);
myArrayList1.add(1);
ArrayList<Integer> myArrayList2 = new ArrayList<Integer>();
myArrayList2.add(2);
myArrayList2.add(2);
myArrayList2.add(2);
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
alal.add(myArrayList1);
alal.add(myArrayList2);
for(ArrayList<Integer> al : alal)
{
al.set(0, 99);
}
System.out.println(alal);
}
}
編輯:我試圖根據SMA的帖子來編輯我的代碼,以便即使使用set方法,我的內容仍然保持不變。 這是我嘗試過的方法,但是我的輸出仍然反映了更改[[99,1,1],[99,2,2]]
package proj;
import java.util.ArrayList;
public class Ask
{
public static void main(String[] args)
{
ArrayList<Integer> myArrayList1 = new ArrayList<Integer>();
myArrayList1.add(1);
myArrayList1.add(1);
myArrayList1.add(1);
ArrayList<Integer> myArrayList2 = new ArrayList<Integer>();
myArrayList2.add(2);
myArrayList2.add(2);
myArrayList2.add(2);
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
alal.add(new ArrayList<Integer>(myArrayList1));//creating seperate instance of array list with same content as original list
alal.add(new ArrayList<Integer>(myArrayList2));
for(ArrayList<Integer> al : alal)
{
al.set(0, 99);
}
System.out.println(alal);
}
}
編輯2:但是,我在普通的ArrayList中看不到相同的行為。 即使在循環內將其編輯為99,這里的內容仍保留為[1、2、3]。 那么,是否在這里創建了這些變量的新實例? 他們不是像以前一樣僅僅是參考嗎?
package proj;
import java.util.ArrayList;
public class Ask
{
public static void main(String[] args)
{
ArrayList<Integer> myArrayList = new ArrayList<Integer>();
myArrayList.add(1);
myArrayList.add(2);
myArrayList.add(3);
for(int element : myArrayList)
{
element = 99;
}
System.out.println(myArrayList);
}
}
我期待着,因為我只更改了一個名為“ al”的新變量的內容
alal
包含對ArrayList
的引用。 當您遍歷那些ArrayList
,您沒有在創建新的ArrayList
對象。 因此, al
任何變化都反映在alal
。
當將現有對象的引用分配給新的引用變量時(如在for循環中所做的那樣),就不會創建新的對象。 新變量( al
您的情況)僅引用現有對象。
如果要遍歷alal
而不更改contains中的ArrayLists,則必須創建包含原始ArrayLists副本的alal
副本,或者在創建副本時使用其他循環遍歷alal
:
for (int i = 0; i < alal.length; i++) {
ArrayLst<Integer> al = new ArrayList<Integer>(alal.get(i)); // create copy
al.set(0, 99);
}
當然,此循環沒有多大意義,因為您正在修改ArrayList
,它將永遠不會在任何地方使用。 我假設在您的實際代碼中,您正在使用修改后的ArrayList
。
您只是使用與alal
相同的數組列表引用(在堆中的引用)作為原始的myArrayList1
和myArrayList2
,因此它作用於同一列表並修改了第0個索引元素。
如果您不希望循環影響原始列表,則應執行以下操作:
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
alal.add(new ArrayList<Integer>(myArrayList1));//creating seperate instance of array list with same content as original list
alal.add(new ArrayList<Integer>(myArrayList2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.