首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >arraylist = arraylist与arraylist.addAll(arraylist)之间的差异

arraylist = arraylist与arraylist.addAll(arraylist)之间的差异
EN

Stack Overflow用户
提问于 2017-04-07 07:14:44
回答 3查看 667关注 0票数 2

将数组列表分配给另一个数组与在两个数组列表之间使用addAll方法有什么区别?

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

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

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

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

我做了下面的测试代码,并找到了我不知道的结果。

代码语言:javascript
复制
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);

结果是:

代码语言:javascript
复制
CHECK: first list =  [1, 2]
CHECK: Firs list add : [1, 2, 1, 2]
CHECK: Firs list add 2 : []

我原以为最后一个日志的结果如下:[1,2]

正如docs.oracle.com中提到的

addAll-按照指定集合的Iterator返回元素的顺序,将指定集合中的所有元素追加到此列表的末尾。

如果名单上没有数据呢?那么addAll会做什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-07 07:19:50

当你这样做时:

代码语言:javascript
复制
firstList = secondList;

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

这就是为什么在您清除firstList之后,secondList也丢失了所有的元素。他们指的是同样的东西。这与addAll无关。当您调用firstList.addAll(secondList)时,基本上是将一个空列表添加到另一个空列表中,这将导致一个空列表。

票数 8
EN

Stack Overflow用户

发布于 2017-04-07 07:20:43

使用arrayList = arrayList2;时,您将在第一个列表中指定arrayList2的引用。这意味着他们指的是同一份清单。

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

现在回到您的代码(让我们将第一个列表表示为f,第二个表示为s)

代码语言:javascript
复制
        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);
票数 4
EN

Stack Overflow用户

发布于 2017-04-07 07:18:49

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

代码语言:javascript
复制
firstArray = secondArray;

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

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43271896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档