【发布时间】:2018-08-17 20:18:41
【问题描述】:
假设我有这个代码:
String[] left = { "1", "2" };
String[] leftNew = Collections.emptyList().toArray(left);
System.out.println(Arrays.toString(leftNew));
这将打印[null, 2]。这种某种是有道理的,因为我们有一个空列表,它以某种方式假设可以处理我们传递一个更大的数组并将第一个元素设置为空的事实。这可能是说空列表中不存在第一个元素,因此它设置为null。
但这仍然令人困惑,因为我们传递一个特定类型的数组只是为了帮助推断返回的数组的类型;但无论如何,这至少具有一定的逻辑。但如果我这样做:
String[] right = { "nonA", "b", "c" };
// or Collections.singletonList("a");
// or a plain List or Set; does not matter
String[] rightNew = Collections.singleton("a").toArray(right);
System.out.println(Arrays.toString(rightNew));
以前面的例子作为参考,我希望这个例子可以展示:
["a", "b", "c"]
但是,有点出乎我的意料,它会打印:
[a, null, c]
当然,我会查看明确说明这是预期的文档:
如果此集合适合指定的数组并有剩余空间(即,数组的元素比此集合多),则数组中紧跟集合末尾的元素设置为 null。
好的,好的,这至少有文档记录。但它后来说:
只有当调用者知道这个集合不包含任何空元素时,这对确定这个集合的长度很有用。
这是文档中最让我困惑的部分:|
还有一个更有趣但对我来说毫无意义的例子:
String[] middle = { "nonZ", "y", "u", "m" };
List<String> list = new ArrayList<>();
list.add("z");
list.add(null);
list.add("z1");
System.out.println(list.size()); // 3
String[] middleNew = list.toArray(middle);
System.out.println(Arrays.toString(middleNew));
这将打印:
[z, null, z1, null]
所以它从数组中清除了最后一个元素,但是为什么在第一个示例中它不这样做呢?
有人可以在这里解释一下吗?
【问题讨论】:
-
我不明白这个问题。他们都将以下元素设置为 null。哪里不一致?
-
@shmosel 没有矛盾,真正的问题是为什么会发生这种情况,是否有(并且可能会有)代码实际利用了这一点?
-
我猜假设您可能正在覆盖目标数组中的数据,在这种情况下,空值可以告诉您上限。看起来不是很有用,tbh。
-
@shmosel 这个答案和 cmets 怎么样? stackoverflow.com/a/51902457/1059372 这更有意义吗?我认为它回答了我的问题...
-
我仍然不完全确定您的问题是什么。如果您问如果前面有空值,将下一个元素设置为空值有什么用处,那么,它不是。这正是文档在您的第二个引用中所说的内容。
标签: java arraylist collections