Предположим, у меня есть этот код:
String[] left = { "1", "2" };
String[] leftNew = Collections.emptyList().toArray(left);
System.out.println(Arrays.toString(leftNew));
Это напечатает [null, 2]
. Такой подход имеет смысл, поскольку у нас есть пустой список, он каким-то образом предполагает, что мы справляемся с тем, что мы передаем массив, который больше, и устанавливает первый элемент в null. Вероятно, это говорит о том, что первый элемент не существует в пустом списке, поэтому он устанавливает значение 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]
И, конечно же, я перехожу к документации, в которой явно говорится, что это ожидается:
Если этот набор подходит в указанном массиве с запасной комнатой (т.е. Массив имеет больше элементов, чем этот набор), элемент в массиве сразу после конца набора устанавливается в нуль.
Хорошо, хорошо, это, по крайней мере, документировано. Но это позже говорит:
Это полезно при определении длины этого набора, только если вызывающий абонент знает, что этот набор не содержит никаких нулевых элементов.
Это часть документации, которая меня смущает больше всего: |
И еще один пример funner, который не имеет для меня никакого смысла:
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]
Таким образом, он очищает последний элемент от массива, но почему это не будет сделано в первом примере?
Может кто-то пролил свет здесь?