Java Array List和对象传递

时间:2013-03-26 05:09:34

标签: java function object arraylist

我的代码中有一个字符串列表。我将字符串列表传递给函数并修改它。(我正在添加/删除列表中的几个元素)。但我不希望这些更改反映在调用函数中。更改应仅反映在被调用函数中。但是因为对象是通过引用传递的,所以我认为这些更改都会在两个函数中得到反映。我怎么能避免这种情况。请帮忙

6 个答案:

答案 0 :(得分:2)

在方法中,您可以明确地复制列表:

private void method(ArrayList<String> list) {
    ArrayList<String> copy = new ArrayList<String>(list);
    // Rest of the method
}

答案 1 :(得分:1)

在将对象传递给函数之前,您必须复制该对象。

答案 2 :(得分:1)

在sub方法中使用原始数组列表的新ArrayList。

答案 3 :(得分:1)

您可以使用Clone方法。

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

callee(List<String> aCloned)
{

}

答案 4 :(得分:1)

通常不建议使用clone方法。见clone(): ArrayList.clone() I thought does a shallow copy

但是你可以试试这个方法

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

在这里,您使用ArrayList的构造函数为您提供传入的列表的新副本。

答案 5 :(得分: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;
        }
    }
}