Java ArrayList clear()方法

时间:2014-04-22 20:03:55

标签: java arraylist

我无法理解下面的代码。 clear方法删除分配给“al”的所有元素吧?然后ArrayList al接收字符串Str2的值,alal接收Str3的值。

那么如果仅使用Str3分配alal,那么输出如何如下?有人可以解释一下吗?非常感谢

输出:

[String 2]

[[String 2],String 3]

public static void main(String[] args){

    String Str1 = "String 1";
    String Str2 = "String 2";
    String Str3 = "String 3";


    ArrayList al = new ArrayList();
    ArrayList alal = new ArrayList();


    al.add(Str1);
    alal.add(al);

    al.clear();

    al.add(Str2);
    alal.add(Str3);

    System.out.println(al);
    System.out.println(alal);
}

6 个答案:

答案 0 :(得分:7)

您正在使用原始ArrayList,因此您可以在列表中存储任何类型的Object。请注意,您要在al内存储alal,这意味着将al的引用存储到alal,而不是al中的值alal 1}}。

更深入的解释:

al.add(Str1); //al -> [String 1]
alal.add(al); //alal -> [ [String 1] ]

al.clear(); //al -> []   ,   alal -> [ [] ]
al.add(Str2); // al -> [String 2] , alal -> [ [String 2] ]
alal.add(Str3); //alal -> [ [String 2], String 3]

System.out.println(al);
System.out.println(alal);

来自您给定代码的一些建议:

  • 为变量使用更好的名称。对于基本示例,alalal可能看起来,但提供有助于代码可读性的名称会更好。
  • 如果您想阻止您或其他程序员在<{1}}(或其他ArraList)中存储任何,请使用generics。这意味着,声明变量如Collection所以现在编译器将检查您是否只能添加ArrayList<String> alal值。
  • 如果您想将String中的元素传递给al,请使用ArrayList#addAll方法。
  • 在这种情况下,最好将变量声明为alal而不是List。最好习惯program to an interface rather than a direct class implementation

答案 1 :(得分:0)

因为alal引用了al

al引用所做的任何更改都会反映在alal

答案 2 :(得分:0)

你从未清除过alal,所以当你添加Str3时它仍然包含al。

答案 3 :(得分:0)

当您执行alal.add(al);时,您没有将任何内容从al复制到alal,实际上您正在使alal的第一个元素成为al (您将列表存储到列表中,这是允许的)。清除al后,您将删除其中的所有元素,但不会创建新列表(不再位于alal中)。 当您打印alal时,您将打印其中的每个元素。第一个元素是列表al,其打印为[String 2](然后是String 3)。

答案 4 :(得分:0)

首先,在您的代码中,您声明了3个String变量(Str1,Str2和Str3)和2个ArrayList(al和alal)。

现在,您将元素Str1添加到列表al:

al.add(Str1); //Here your variable al has the value ["String1"]

分配时

alal.add(al); // Now your variable alal has the value [["String1"]]

当您将新元素添加到变量alal时,结果为

alal.add(Str3); // Now you are adding the string to your array, and the result is `[["String1"],"String 3"]`

如果您需要在收件人之前删除结果,您需要对您的alal变量执行.clear只包含字符串数组而不是字符串数组。

答案 5 :(得分:0)

让我们考虑逐行发生的事情:

<强> 1

al.add(Str1);

al现在包含String&#34; String 1&#34;所以它看起来像:[&#34; String 1&#34;]

<强> 2

alal.add(al);

alal现在包含alal目前是[&#34;字符串1&#34;])。因此,alal看起来像:[[&#34; String 1&#34;]]

第3

al.clear();

由于al的内容被清除,现在看起来像:[] 但alal也引用了al,因此alal将如下所示:[[]]

<强> 4

al.add(Str2);

al现在看起来像:[&#34; String 2&#34;] 我们知道,alal也有al的引用,因此alal将如下所示:[[&#34; String 2&#34;]]

<强> 5

alal.add(Str3);

最后,我们添加&#34; String 3&#34;到alal(这是[[&#34;字符串2&#34;]]),所以它变成:[[&#34;字符串2&#34;],&#34;字符串3&#34 ]

<强>最后

现在al是[&#34;字符串2&#34;],alal是[[&#34;字符串2&#34;],&#34;字符串3&#34 ]