[英]Passing ArrayList as a parameter
首先讓我說我不能在這里放任何代碼,因為我的筆記本電腦上的互聯網不能工作,所以我通過手機發布這個。 好吧問題是我說有兩個類:第一和第二類。 第一類將ArrayList
作為其屬性之一,它從類2調用void方法並將該ArrayList
作為參數傳遞。 現在該方法初始化另一個ArrayList
並使其等於我傳遞的參數並對新的ArrayList
進行更改。 有趣的是,即使我作為參數傳遞的原始ArrayList也在改變。 可能的原因是什么?
問題是當你使用=來使新的ArrayList成為原始的副本時,你只是創建了對同一個ArrayList的新引用。 可以把它想象成指向同一個對象的兩個變量。
看看這個,它可能會幫助你理解發生了什么: Java是“通過參考傳遞”還是“傳遞價值”?
為了解決您的問題,您需要使用“new”關鍵字創建一個新的ArrayList,然后添加所有對象,或使用clone()方法。
原因是當您傳遞ArrayList作為參數時,被調用的方法可以更改數組的內容。 ArrayList包含對象的引用。 如果要避免某些類將更改ArrayList的內容,則必須返回ArrayList的Copy,其中所有對象都是列表中對象的clone()。
使用object.clone()
ArrayList clonedCopy = new ArrayList(list1.size());
for (Object obj : list1) {
clonedCopy.add(obj.clone());
}
現在給這個clonedCopy回來。 但要確保obj是可復制的!
因為他們指向相同的參考。
示例代碼:
public class MethodArguments {
public static void main(String args[]) {
ArrayList<String> a = new ArrayList<String>();
a.add("Steve");
a.add("Daniel");
a.add("John");
a.add("Maxi");
a.add("Jeni");
System.out.println(a);
display(a);
getSize(a);
}
static void display(ArrayList<String> arrayList1) {
arrayList1.add("Pollard");
System.out.println(arrayList1); // passing the arraylist values and
// adding the element
}
static void getSize(ArrayList<String> arrayList1) {
System.out.println(arrayList1.size()); // getting the size of arraylist
// by passing arguments to
// method
}
}
輸出:
[Steve,Daniel,John,Maxi,Jeni]
[Steve,Daniel,John,Maxi,Jeni,Pollard]
6
Java中的=
運算符只會復制ArrayList
引用(對於所有對象都是如此)。 請參閱此答案以獲取ArrayList的深層副本。
這是因為當您使其等於時,新數組列表指向相同的舊數組。
這個小例子應該澄清一下。
import java.util.ArrayList;
import java.util.List;
public class JavaApplication1 {
public static void main(String[] args) {
List <String> origList = new ArrayList<>();
origList.add("a");
origList.add("b");
JavaApplication1 app = new JavaApplication1();
app.addToList(origList);
for(String str:origList){
System.out.println(str);
}
}
private void addToList(List<String> strList){
System.out.println("inside addToList");
List <String> newList = new ArrayList<>();
// newList = strList; //This is how you are doing it
newList.addAll(strList); //This is how you should do it.
newList.add("x");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.