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

3

请问有人能解释一下这段代码为什么能够运行吗?

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个回答

6
你需要区分你的数组对象的引用(即Object[] op)和引用所指向的实际数组对象
使用

Object[] op = new Object[0];

你正在创建一个大小为0的数组,并将其分配给“op”引用。
但是,接下来:
op = r.toArray();

您正在将一个新的数组对象赋值给op引用。这个新的数组对象是由适当大小的toArray()方法创建的。
早期使用new Object[0];创建的数组对象现在处于悬空状态,并且可能被垃圾回收。

哦,是的。我完全忘记了数组变量也是引用变量。谢谢。 - user3149650

1
出于同样的原因,这段代码打印出X而不是ABC:
String s = "ABC";
String t = "XYZ";
s = t.substring(0, 1);
System.out.println(s);

你正在重新分配op的值,新值与旧值无关。

1
你在这里误解了一个重要的事情。 Java标识符只是指向对象的指针,而不是对象本身。
当你执行以下操作时:
Object[] op = new Object[0];

你创建了一个固定大小为0的新实例数组,并将标识符“op”指向它。
但当你稍后执行时,
op = r.toArray();

你只是覆盖了原来标识符指向的位置。你失去了对第一个数组的引用,它将被垃圾回收。 "op"现在设计了一个新的数组,你原来的数组就消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接