当列表是另一个列表的副本时,列表项将自动删除

时间:2018-07-28 07:57:19

标签: java android arraylist reference

我有一个说list1的列表,然后我将list1的副本复制为list2 现在,如果我从list1中删除一项,那么list2中的同一项目也会被删除。

ArrayList<Object> list1=new ArrayList<>();
//Then I am filling up only list1.
ArrayList<Object> list2=new ArrayList<>();
list1=list2;

for(i=0;i<Constants.list1.size();i++)
    Constants.list1.remove(2);

然后,如果我这样写:

if(Constants.list2.size()==0)
  Toast.makeText(context,"Error",Toast.LENGTH_SHORT).show();

我将Toast视为ERROR。

我想知道将一个列表复制到另一个列表是否使它们指向相同的引用?

4 个答案:

答案 0 :(得分:1)

此代码不是“正在复制”:

list1 = list2;

它使两个变量(list1list2)都指向同一个List对象。因此,无论使用哪个变量引用该列表对象,都将对其进行更改。

要复制列表,可以使用:

list1= new ArrayList<>(list2);

或逐元素复制:

for(i=0;i < list2.size();i++)
    list1.add(list2.get(i));

答案 1 :(得分:0)

之所以会这样,是因为您有两个引用(list1list2)指向同一个内存对象。这是list1=list2分配的结果。

如果要复制初始列表,则需要使用:

ArrayList<Object> list2 = new ArrayList<Object>(list1);

答案 2 :(得分:0)

为避免重复值,首先需要清除arraylist list2.clear();,然后复制完整的arraylist

 ArrayList<Object> list1=new ArrayList<>();
 //Then I am filling up only list1.
 ArrayList<Object> list2=new ArrayList<>();
 list2.clear();    //Before add value clear the arraylist 
 list2.addAll(list1);

答案 3 :(得分:0)

创建列表的独立副本的另一种方法是使用克隆函数并将其强制转换为期望的类型:

替换:

list1 = list2; 

与此:

list1 = (ArrayList<Object>)list2.clone();