【问题标题】:difference between arraylist = arraylist and arraylist.addAll(arraylist)arraylist = arraylist 和 arraylist.addAll(arraylist) 之间的区别
【发布时间】:2017-04-07 07:14:44
【问题描述】:

将一个arraylist分配给另一个和在两个arraylist之间使用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- 将指定集合中的所有元素附加到 此列表的末尾,按照指定的返回顺序 集合的迭代器。

如果列表中没有数据?那么 addAll 会做什么呢?

【问题讨论】:

    标签: java


    【解决方案1】:

    当你这样做时:

    firstList = secondList;
    

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

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

    【讨论】:

      【解决方案2】:

      当您使用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);
      

      【讨论】:

      • 代码中的 cmets 有助于更好地理解。
      【解决方案3】:

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

      firstArray = secondArray;
      

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

      祝你好运!

      【讨论】:

      • 不是内存地址,而是指向对象的链接
      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2011-06-03
      • 1970-01-01
      • 2012-07-24
      • 2012-04-05
      • 2013-07-11
      相关资源
      最近更新 更多