簡體   English   中英

將ArrayList作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM