Java 将ArrayList作为参数传递

Java 将ArrayList作为参数传递,java,arrays,arraylist,Java,Arrays,Arraylist,首先我要说,我不能在这里输入任何代码,因为我的笔记本电脑上的互联网不工作,所以我通过我的手机发布。好吧,问题是我有两个班:一班和二班。类1的属性之一是ArrayList,它从类2中调用void方法,并将该ArrayList作为参数传递。现在,该方法初始化另一个ArrayList,使其等于我传递的参数,并对新的ArrayList进行更改。有趣的是,甚至我最初作为参数传递的ArrayList也在改变。可能的原因是什么?因为它们指向同一个引用 问题在于,当您使用=使新ArrayList成为原始Arra

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

因为它们指向同一个引用

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

看看这个,它可能会帮助你了解发生了什么:


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

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

使用object.clone()


现在把这个克隆副本还给我。但要确保obj是可克隆的

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");
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类JavaApplication1{
公共静态void main(字符串[]args){
List origList=new ArrayList();
原件。添加(“a”);
原件。添加(“b”);
javaapplication1app=新的JavaApplication1();
附录addToList(origList);
对于(字符串str:origList){
系统输出打印项次(str);
}
}
私有void addToList(列表strList){
System.out.println(“内部添加列表”);
List newList=newarraylist();
//newList=strList;//您就是这样做的
newList.addAll(strList);//您应该这样做。
新列表。添加(“x”);
}
}

示例代码:

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
 }

}
公共类方法参数{
公共静态void main(字符串参数[]){
ArrayList a=新的ArrayList();
a、 添加(“史蒂夫”);
a、 添加(“丹尼尔”);
a、 添加(“约翰”);
a、 添加(“最大值”);
a、 添加(“杰尼”);
系统输出打印项次(a);
显示器(a);
(一);
}
静态无效显示(ArrayList ArrayList 1){
arrayList1.添加(“Pollard”);
System.out.println(arrayList1);//传递arraylist值和
//添加元素
}
静态void getSize(ArrayList ArrayList 1){
System.out.println(arrayList1.size());//获取arraylist的大小
//通过将参数传递给
//方法
}
}
输出:

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
 }

}
[史蒂夫、丹尼尔、约翰、马克西、杰尼]

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

六,


我猜是因为堆中有两个对同一对象的引用。因此,对第一个参考的任何修改都会反映到另一个参考上。有关更多详细信息,请参阅。列表是否更改(元素已删除/添加/重新排序)或列表中的元素(其属性)?要点正确,但更简单的代码是
ArrayList copy=new ArrayList(incomingList)@user949300不!您的代码不会复制列表中的对象,它只会复制对它的引用。如果您想在列表中包含一个日期对象,并将您的复制列表提供给另一个类。另一个类可以更改列表中的日期对象!因此,如果可能的话,克隆或使用原语类型(Date:better long)True,这是使用原语/不可变的一个很好的观点。但是,这取决于是否允许其他类进行更改。由于OP提到方法调用是无效的,所以他希望允许更改似乎是合理的。否则就不清楚另一个方法实际上是如何做的