Java 将一个ArrayList值分配给另一个ArrayList值
我有许多函数将全局ArrayList作为参数,其中一些函数不对此列表进行任何更改,其他函数在工作时需要删除此数组的某些元素,因此我在这些函数中创建了一个局部临时数组Java 将一个ArrayList值分配给另一个ArrayList值,java,arraylist,Java,Arraylist,我有许多函数将全局ArrayList作为参数,其中一些函数不对此列表进行任何更改,其他函数在工作时需要删除此数组的某些元素,因此我在这些函数中创建了一个局部临时数组 static ArrayList array1 = new ArrayList(); public fn1(ArrayList array1) { ArrayList tempArray1 = new ArrayList(); tempArray1 = array1; tempArray1.remove(elem
static ArrayList array1 = new ArrayList();
public fn1(ArrayList array1)
{
ArrayList tempArray1 = new ArrayList();
tempArray1 = array1;
tempArray1.remove(elemnt);
}
问题是删除的元素也从原始arrayListarray1
中删除了,我不知道为什么
谢谢..尝试执行以下操作
List tempList = new ArrayList(oldArrayList);
一致:
tempArray1 = array1;
您正在使tempArray1
变量引用与array1
所引用的ArrayList
相同的对象。因此,两者都引用了ArrayList
的同一个对象。使用任何变量在ArrayList
对象中所做的任何更改都将由这两个变量反映出来。因此,当您使用以下方法删除图元时:
tempArray1.remove(elemnt);
array1
也反映了元素的移除
你应使用:
ArrayList tempArray1 = new ArrayList(array1);
按照官方文件的规定:
构造包含指定集合的元素的列表,
按照集合迭代器返回的顺序
参数:
c-其元素将被放入此列表的集合
问题是声明
tempArray1=array1代码>只是将tempArray1
作为对array1
的引用。
要创建真实副本,请调用以下命令:
ArrayList tempArray1 = new ArrayList(array1);
您正在将创建的实例替换为全局实例。试试这个:
ArrayList tempArray1 = new ArrayList(array1);
tempArray1.remove(elemnt);
从原始ArrayList
中删除该项的原因是,在Java中,引用类型的变量(数组、字符串和对象的子类的任何其他变量)包含引用,而不是值。这本质上意味着ArrayList
类型的变量保存分配ArrayList
数据的内存地址。当您执行tempArray1=array1
,您只是给了tempArray1
同一ArrayList
的地址。这一切只适用于从Java中的对象
派生的类型,如果您不知道的话,它确实包括字符串
。基本类型(byte
,short
,int
,long
,char
,float
,double
)作为值存储
现在,谈谈你真正的问题;我必须问,为什么不使用get(index)
方法来处理该项
如果需要实际删除元素,请使用ArrayList
的复制构造函数,如下所示:
ArrayList tempArray1=新的ArrayList(array1)代码>您还可以使用addAll(集合c)方法
A) tempArray1
是一个变量,它引用与array1
相同的实例。要制作副本,请使用复制构造函数:
List tempArray1 = new ArrayList(tempArray1);
B) 从方法中删除参数。不需要在中传递列表-方法中的代码已经可以访问列表。事实上,通过使用相同名称的参数传入,您正在隐藏原始列表-如果传入了不同的列表,您将使用该列表,而不是您认为正在使用的列表
C) 您应该键入您的列表,例如:
static ArrayList<String> array1 = new ArrayList<String>();
static ArrayList array1=new ArrayList();
D) 始终使用抽象类:将其更改为列表:
static List<String> array1 = new ArrayList<String>();
静态列表array1=新的ArrayList();
E) 列表不是数组,因此不要调用变量“array1”-它会误导:
static List<String> list1 = new ArrayList<String>();
static List list1=new ArrayList();
我认为您误解了Java的一些命运:
声明Java变量时,它是对象的引用,就像C/C++中的指针一样。它可以是对以前创建的对象的引用,也可以创建一个新对象来引用
//Created a new object instance on heap
ArrayList tempArray1 = new ArrayList();
//Both tempArray1 and tempArray2 will point to same object in memory
ArrayList tempArray2 = tempArray1;
在代码中,首先创建一个新的ArrayList
对象引用tempArray1
并为其创建一个新对象ArrayList tempArray1=new ArrayList()代码>然后通过tempArray1=array1将其他引用分配给该引用代码>。所以,您创建的第一个对象没有指向它的引用,将被删除。现在,tempArray1和tempArray2都指向同一个项目
在Java中,如果要复制对象,可以使用它的clone
方法,前提是它实现了Clonable
接口。另外,请看这个问题,以获得有关克隆的详细答案
因此,您希望制作阵列的副本,但这样做是错误的
这是因为arraylist是引用类型,而您的新arraylist引用的是外部类型。对新版本的任何更改都将反映到外部版本。
//Created a new object instance on heap
ArrayList tempArray1 = new ArrayList();
//Both tempArray1 and tempArray2 will point to same object in memory
ArrayList tempArray2 = tempArray1;