将列表转换为固定大小的数组

时间:2014-01-30 14:30:01

标签: java arrays

有人可以解释一下为什么这段代码片段有效吗?

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”,那么为什么/如何将列表元素添加到数组中呢?感谢

3 个答案:

答案 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现在是一个新的数组,你的前一个就消失了。