11

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

4

6 回答 6

6

问题是当您使用 = 使新的 ArrayList 成为原始的副本时,您只是在创建对同一 ArrayList 的新引用。将其视为指向同一对象的两个变量。

看看这个,它可能会帮助您了解正在发生的事情:Java 是“按引用传递”还是“按值传递”?

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

于 2012-11-22T00:20:51.703 回答
3

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

使用 object.clone()

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

现在把这个 clonedCopy 还给他。但要确保 obj 是可克隆的!

于 2012-11-22T00:22:29.737 回答
3

示例代码:

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
 }

}

输出:

[史蒂夫、丹尼尔、约翰、马克西、珍妮]

[史蒂夫、丹尼尔、约翰、马克西、杰妮、波拉德]

6

于 2015-12-22T17:22:05.777 回答
1

因为它们指向相同的引用。

于 2012-11-22T00:20:06.083 回答
0

Java 中的=操作符只会复制ArrayList引用(所有对象都一样)。请参阅此答案以制作 ArrayList 的深层副本。

于 2012-11-22T00:37:49.783 回答
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");
    }
}
于 2012-11-22T00:39:37.313 回答