将ArrayList作为参数传递

时间:2012-11-22 00:17:30

标签: java arrays arraylist

首先让我说我不能在这里放任何代码,因为我的笔记本电脑上的互联网不能工作,所以我通过手机发布这个。好吧问题是我说有两个类:第一和第二类。第一类有ArrayList作为其属性之一,它从类2调用void方法并将ArrayList作为参数传递。现在该方法初始化另一个ArrayList并使其等于我传递的参数并对新ArrayList进行更改。有趣的是,即使我作为参数传递的原始ArrayList也在改变。可能的原因是什么?

6 个答案:

答案 0 :(得分:6)

问题是当你使用=来使新的ArrayList成为原始的副本时,你只是创建了对同一个ArrayList的新引用。可以把它想象成指向同一个对象的两个变量。

检查一下,它可能会帮助您了解正在发生的事情:Is Java "pass-by-reference" or "pass-by-value"?

为了解决您的问题,您需要使用“new”关键字创建一个新的ArrayList,然后添加所有对象,或者使用clone()方法。

答案 1 :(得分:3)

原因是当您传递ArrayList作为参数时,被调用的方法可以更改数组的内容。 ArrayList包含对象的引用。 如果你想避免某些类会改变你的ArrayList的内容 返回ArrayList的副本,其中的所有对象都是列表中对象的clone()。

使用object.clone()

ArrayList clonedCopy = new ArrayList(list1.size());
for (Object obj : list1) {
  clonedCopy.add(obj.clone());
}

现在回复这个clonedCopy。但要确保obj是可复制的!

答案 2 :(得分:1)

因为他们指向相同的参考。

答案 3 :(得分:1)

Java中的=运算符只会复制ArrayList引用(所有对象都是相同的)。请参阅this answer以获取ArrayList的深层副本。

答案 4 :(得分:1)

示例代码:

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

答案 5 :(得分:0)

这是因为当你使它等于。

时,新数组列表指向同一个旧数组

这个小例子应该澄清它。

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");
    }
}