Java 将ArrayList作为参数传递
首先我要说,我不能在这里输入任何代码,因为我的笔记本电脑上的互联网不工作,所以我通过我的手机发布。好吧,问题是我有两个班:一班和二班。类1的属性之一是Java 将ArrayList作为参数传递,java,arrays,arraylist,Java,Arrays,Arraylist,首先我要说,我不能在这里输入任何代码,因为我的笔记本电脑上的互联网不工作,所以我通过我的手机发布。好吧,问题是我有两个班:一班和二班。类1的属性之一是ArrayList,它从类2中调用void方法,并将该ArrayList作为参数传递。现在,该方法初始化另一个ArrayList,使其等于我传递的参数,并对新的ArrayList进行更改。有趣的是,甚至我最初作为参数传递的ArrayList也在改变。可能的原因是什么?因为它们指向同一个引用 问题在于,当您使用=使新ArrayList成为原始Arra
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提到方法调用是无效的,所以他希望允许更改似乎是合理的。否则就不清楚另一个方法实际上是如何做的代码>