繁体   English   中英

arraylist = arraylist和arraylist.addAll(arraylist)之间的区别

[英]difference between arraylist = arraylist and arraylist.addAll(arraylist)

将arraylist分配给另一个并在两个arraylists之间使用方法addAll有什么区别?

1> arrayList = arrayList; //应该将后面的arrayList的值赋给第一个。

2> arrayList.addAll(arrayList) //将后面列表的所有数据添加到第一个。

第一个完全替换列表中的数据? 第二个用于在列表中附加数据(如果已经有任何数据)???

如果我执行arrayList.add(arrayList)而不将任何数据分配给第一个列表,它会插入任何数据吗?

我做了以下代码测试,发现了我真的不知道的结果。

secondList.add("1");
secondList.add("2");

firstList = secondList;
Log.i("CHECK","first list =  "+ firstList);

firstList.addAll(secondList);
Log.i("CHECK","Firs list add : "+firstList);

firstList.clear();
firstList.addAll(secondList);
Log.i("CHECK","Firs list add 2 : "+firstList);

结果是:

CHECK: first list =  [1, 2]
CHECK: Firs list add : [1, 2, 1, 2]
CHECK: Firs list add 2 : []

我期待最后一个日志有如下结果: [1,2]

正如docs.oracle.com中提到的那样

addAll-将指定集合中的所有元素按指定集合的​​迭代器返回的顺序附加到此列表的末尾。

如果列表中没有数据? 什么会添加所有DO?

当你这样做时:

firstList = secondList;

你所说的实际上是“使firstListsecondList引用相同的列表”。 执行该行后,只有一个列表,两个变量都引用该列表。

这就是为什么在清除firstListsecondList丢失了所有元素。 他们指的是同一件事。 这与addAll 当你调用firstList.addAll(secondList) ,你基本上是在另一个空列表中添加一个空列表,这会产生一个空列表。

当你使用arrayList = arrayList2; 然后你在第一个列表中分配arrayList2的引用。 这意味着他们指的是同一个清单。

当你使用arrayList.addAll(arrayList2)它们是两个不同的列表引用。

现在回到你的代码(让我们将firstlist表示为f,将秒表示为s)

        secondList.add("1"); // f={}, s = {1}
        secondList.add("2"); // f={}, s = {1,2}

        firstList = secondList; // f= s = {1, 2}
        Log.i("CHECK","first list =  "+ firstList); // so printing 1,2

        firstList.addAll(secondList);// it is actually adding itself.. so f= s = {1,2,1,2}
        Log.i("CHECK","Firs list add : "+firstList);

        firstList.clear(); // clear boths as s = f
        firstList.addAll(secondList); // as boths are blank so overall blank
        Log.i("CHECK","Firs list add 2 : "+firstList);

我在课堂上学到了这一点,Java并没有真正指定它何时通过值传递或通过引用传递,但是为了arrayList,它们是通过引用传递的,除非你专门创建新元素。 当你说

firstArray = secondArray;

firstArray获取第二个数组的内存地址,因此当您清除第一个数组时,实际上清除了第二个数组也共享的内存。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM