0

コードに文字列のリストがあります。その文字列のリストを関数に渡して変更しています(リストからいくつかの要素を追加/削除しています)が、これらの変更が呼び出し元の関数に反映されることは望ましくありません。変更は、呼び出し先関数にのみ反映される必要があります。しかし、オブジェクトは参照によって渡されるため、変更は両方の関数に反映されていると思います。どうすればこれを回避できますか。助けてください

4

6 に答える 6

2

メソッド内で、リストのコピーを明示的に作成できます。

private void method(ArrayList<String> list) {
    ArrayList<String> copy = new ArrayList<String>(list);
    // Rest of the method
}
于 2013-03-26T05:12:59.647 に答える
1

オブジェクトを関数に渡す前に、オブジェクトのコピーを作成する必要があります。

于 2013-03-26T05:11:23.587 に答える
1

subメソッドで元の配列リストの新しいArrayListを使用します。

于 2013-03-26T05:12:39.817 に答える
1

メソッドを使用できますClone

caller(ArrayList<String> a)
{
    callee((List<String>)a.clone());
}

callee(List<String> aCloned)
{

}
于 2013-03-26T05:13:13.997 に答える
1

通常、このclone方法はお勧めしません。このclone()を参照してください:ArrayList.clone()浅いコピーを行うと思いました

ただし、この方法を試すことができます

public void doOperation(List<String> list){
    List<String> duplicateList = new ArrayList(list);
    // add, or delete stuff on duplicateList
}

ここでは、のコンストラクターを使用して、ArrayList渡されるリストの新しいコピーを提供します。

于 2013-03-26T05:17:19.237 に答える
1

ループを使用して古いリストから新しいリストを手動で作成する必要があり、そのメソッドに渡す必要があります。すなわち

   List<String> list=new ArrayList<>();
    list.add("first");
    list.add("last");
    List<String>list2 =new ArrayList<String>();
    for(String value:list)
    {
    list2.add(new String(value));
    }
    System.out.println("list2-->"+list2);

new ArrayList<String>(list);これは、リストの新しい参照を提供しますが、オブジェクトには同じ参照があるためです。

編集:

public class ArrayCopy {


    public static void main(String[] args) {

        ArrayCopy arrayCopy=new ArrayCopy();
        arrayCopy.copyData();

    }
    public void copyData()
    {
        List<Test> oldList=new ArrayList<Test>();
        oldList.add(new Test("1",10));
        oldList.add(new Test("2",45));
        List<Test> newList =new ArrayList<Test>(oldList);
        System.out.println("newList-->"+newList);

        /**
         * New Copy of Data
         */
        List<Test> newList1 =new ArrayList<Test>();
        for(Test test:newList)
        {
            newList1.add(copyProperty(test));
        }
        System.out.println("newList-->"+newList1);
    }
    private Test copyProperty(Test test)
    {
        Test newTest=new Test(test.getId(), test.getNumber());
        return newTest;
    }
    class Test{
        String id;
        int number;
        public Test(String id,int number) {
            this.id=id;
            this.number=number;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public int getNumber() {
            return number;
        }
        public void setNumber(int number) {
            this.number = number;
        }
    }
}
于 2013-03-26T05:32:39.847 に答える