将一个数组列表分配给另一个数组列表和在两个数组列表之间使用方法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;
你说的实际上是"使firstList
和secondList
参考同一个列表"。执行该行后,将只有一个列表,并且两个变量都引用该列表。
这就是为什么在你清除firstList
后,secondList
也失去了所有的元素。它们指的是同一件事。这与addAll
无关.当你调用firstList.addAll(secondList)
时,你基本上是在添加一个空列表附加到另一个空列表,这会导致一个空列表。
当你使用arrayList = arrayList2;
时,你在第一个列表中分配了arrayList2
的引用。这意味着他们指的是同一个列表。
当您使用arrayList.addAll(arrayList2)
时,它们是两个不同的列表引用。
现在回到你的代码(让我们将第一个列表表示为 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 获取第二个数组的内存地址,因此当您清除第一个数组时,您实际上清除了第二个数组也共享的内存。
祝你好运!