有人可以解释一下为什么这段代码片段有效吗?
Object[] op = new Object[0];
ArrayList r = new ArrayList();
r.add("1");
r.add("3");
r.add("5");
r.add("6");
r.add("8");
r.add("10");
op = r.toArray();
System.out.println(op[3]);
这打印出来6.我知道你可以将列表转换为数组,但我想如果数组是固定大小的话,你就无法添加更多的元素。在这种情况下,数组op的大小固定为“0”,那么为什么/如何将列表元素添加到数组中呢?感谢
答案 0 :(得分:6)
您需要区分引用与数组对象(即Object[] op
)和引用所指向的实际数组对象。
用
Object[] op = new Object[0];
您正在创建一个大小为0的数组,并将其分配给op
引用。
然后,用
op = r.toArray();
您正在为op
引用分配新的数组对象。这个新的数组对象是由toArray()
方法创建的,具有适当的大小。
使用new Object[0];
创建的早期数组对象现在悬空并且需要进行垃圾回收。
答案 1 :(得分:1)
出于同样的原因,此代码打印出X而不是ABC:
String s = "ABC";
String t = "XYZ";
s = t.substring(0, 1);
System.out.println(s);
您正在重新分配op的值,而新值与旧值无关。
答案 2 :(得分:1)
你在这里误解了一件重要的事情。 Java标识符只是指向对象的指针,而不是对象本身。
这时你做
Object[] op = new Object[0];
您创建一个固定大小为0的新实例数组,并将标识符“op”指向它。
但是当你以后做的时候
op = r.toArray();
你只是覆盖你以前的标识符指向的位置。您将失去对将要收集的第一个阵列的引用。 “op”desgin现在是一个新的数组,你的前一个就消失了。