Java 将一个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

我有许多函数将全局ArrayList作为参数,其中一些函数不对此列表进行任何更改,其他函数在工作时需要删除此数组的某些元素,因此我在这些函数中创建了一个局部临时数组

static ArrayList array1 = new ArrayList();

public fn1(ArrayList array1)
{
   ArrayList tempArray1 = new ArrayList();
   tempArray1 = array1;
   tempArray1.remove(elemnt);
}
问题是删除的元素也从原始arrayList
array1
中删除了,我不知道为什么


谢谢..

尝试执行以下操作

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;