Hello! 欢迎来到小浪资源网!



Java List.toArray()方法的意外输出:为什么数组元素值并非预期?


Java List.toArray()方法的意外输出:为什么数组元素值并非预期?

Java list.toarray() 方法

list.toarray() 方法将集合转换为数组。但是,在使用该方法时,可能会出现意外的结果。

问题:

以下代码输出令人疑惑的数组值:

立即学习Java免费学习笔记(深入)”;

        list<integer> list = list.of(12, 34, 56);         integer[] array = list.toarray(new integer[]{1, 2, 1, 43, 32, 1});         system.out.println(arrays.tostring(array)); // 输出:[12, 34, 56, NULL, 32, 1]

预计的输出应为:[12, 34, 56, null, null, null],但它却包含了一个意外的非空元素 32。这是为什么

答案:

toarray() 方法文档指出:

如果数组可以容纳列表中的所有元素并留有空余(即,数组的元素比列表多),数组中紧跟在列表末尾后面的元素将设置为 null。

也就是说,当数组长度大于等于集合长度时,数组中紧跟在集合元素后面的第一个元素将被置为空。这在确定集合长度时很有用,前提是调用者知道集合不包含任何 null 元素。

实现:

以 arraylist 为例,其 toarray() 方法的实现如下:

public <T> T[] toArray(T[] a) {     if (a.length < size)         // 为 a 的运行时类型创建一个新数组,但使用我的内容:         return (T[]) Arrays.copyOf(elementData, size, a.getClass());     System.arraycopy(elementData, 0, a, 0, size);     if (a.length > size) // 如果数组长度大于列表,将列表后面的第一个位置置为 null         a[size] = null;     return a; }

结论:

在示例代码中,toarray() 方法将一个长度为 6 的数组传递给长度为 3 的列表,这导致数组中紧跟在列表元素后面的第一个元素 a[3](即 a[3])被置为空。数组的其他元素包含列表中的值。

相关阅读