我有很多函数将全局ArrayList作为参数,其中一些不对此列表进行任何更改,而其他函数需要在工作时删除此数组的某些元素,因此我在其中创建一个本地tempArrays这些功能。
static ArrayList array1 = new ArrayList();
public fn1(ArrayList array1)
{
ArrayList tempArray1 = new ArrayList();
tempArray1 = array1;
tempArray1.remove(elemnt);
}
问题是删除的元素也从原始arrayList array1
中删除,我不知道为什么?
谢谢..
答案 0 :(得分:6)
排队:
tempArray1 = array1;
您正在使用tempArray1
变量来引用ArrayList
引用的array1
的同一对象。因此两者都引用ArrayList
的相同对象。使用任何变量在ArrayList
对象中进行的任何更改都将由两个变量反映出来。因此,当您使用:
tempArray1.remove(elemnt);
array1
也反映了元素的删除。
您应该使用:
ArrayList tempArray1 = new ArrayList(array1);
正如官方文档中所述:ArrayList(Collection<? extends E> c)
:
构造一个包含指定集合元素的列表, 按照它们由集合的迭代器返回的顺序。
参数: c - 要将其元素放入此列表的集合
答案 1 :(得分:4)
问题在于声明tempArray1 = array1;
只会使tempArray1
成为array1
的引用。
要创建真实副本,请调用:
ArrayList tempArray1 = new ArrayList(array1);
答案 2 :(得分:2)
尝试执行以下操作
List tempList = new ArrayList(oldArrayList);
答案 3 :(得分:2)
从原始ArrayList
中删除项目的原因是,在Java中,引用类型的变量(数组,字符串以及其他任何其他的{{1}的子类1}})按住引用,而不是值。这实际上意味着类型Object
的变量保存了分配ArrayList
数据的内存地址。执行ArrayList
后,您只需提供tempArray1 = array1;
相同tempArray1
的地址即可。这一切仅适用于从Java中ArrayList
派生的类型,如果您不知道,它恰好包含Object
。 原始类型(String
,byte
,short
,int
,long
,char
,{{1} })存储为值。
现在,解决你真正的问题;我必须问,为什么你不只是使用float
方法来处理这个项目?
如果您需要实际删除元素,请使用double
的复制构造函数,如下所示:
get(index)
答案 4 :(得分:2)
我认为你有一些被误解的Java:
声明Java变量时,它是对象的重新引用,就像C / C ++中的指针一样。它可以是先前创建的对象的参考,也可以创建一个新的对象来进行referance。
//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
对象referance tempArray1
并为其创建一个新对象ArrayList tempArray1 = new ArrayList();
,然后通过{{1}为此referance分配其他参考资料}。因此,您创建的第一个对象没有指向它的引用,将被删除。现在tempArray1和tempArray2都指向同一个对象。
在Java中如果要复制对象,可以使用它tempArray1 = array1;
方法(如果已实现clone
接口)。另请查看此问题,了解有关克隆的详细解答How do I copy an object in Java?
所以你想制作一个阵列的副本,但你做错了。
答案 5 :(得分:1)
您正在使用全局实例替换您创建的实例。试试这个:
ArrayList tempArray1 = new ArrayList(array1);
tempArray1.remove(elemnt);
答案 6 :(得分:1)
您也可以使用addAll(Collection c)方法
static ArrayList array1 = new ArrayList();
public fn1(ArrayList array1)
{
ArrayList tempArray1 = new ArrayList();
tempArray1.addAll(array1);
tempArray1.remove(elemnt);
}
答案 7 :(得分:1)
A)tempArray1
是一个变量,它将相同的实例称为array1
。要制作副本,请使用复制构造函数:
List tempArray1 = new ArrayList(tempArray1);
B)从方法中删除参数。无需传递列表 - 方法中的代码已经具有对列表的访问权限。事实上,通过使用具有相同名称的参数传递它,您阴影原始列表 - 如果传入了不同的列表,您将使用它而不是您认为的列表正在与之合作。
C)您应该输入您的列表,例如:
static ArrayList<String> array1 = new ArrayList<String>();
D)始终使用抽象类:将其更改为List:
static List<String> array1 = new ArrayList<String>();
E)列表不是数组,所以不要调用变量“array1” - 它具有误导性:
static List<String> list1 = new ArrayList<String>();