我无法理解下面的代码。 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);
}
答案 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);
来自您给定代码的一些建议:
al
和alal
可能看起来好,但提供有助于代码可读性的名称会更好。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
现在包含al
(al
目前是[&#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 ]