概述
在集合转换成数组时通常可以看到xxx.toArray(new Object[0])的代码,为什么这样写呢,什么意思呢?
示例
public static void main(String[] args) {
Set<Integer> sets = new HashSet<>();
sets.add(1);
sets.add(2);
sets.add(3);
Integer[] integers = sets.toArray(new Integer[0]);
Stream.of(integers).forEach(System.out::println);
}
写法的作用
- 返回包含此collection中所有元素的数组,就是一种集合转数组的手段。
- 返回数组的运行时类型与指定数组的运行时类型相同,比如上例中sets集合中的是Integer类型,那么sets.toArray(new Integer[0])这里只能写Integer类型,否则运行失败,不同的类型无法转换。
- 如果指定的数组能容纳改Collection,则返回包含此collection元素的数组,否则将根据指定数组的运行时类型和此collection的大小分配一个新数组。也就是说toArray中的数组容量能够容纳collection,则返回toArray里面的数组,否则生成新数组,项new Object[0]这样的数组肯定是生成新数组了,这里new Object[0]其实就是指定一个新数组元素的类型。
示例如下:toArray中的数组容量足够,所以数据就是放在了integersArray 中了。
存储此 collection 元素的数组(如果其足够大);否则,将为此分配一个具有相同运行时类型的新数组。
public static void main(String[] args) {
Set<Integer> sets = new HashSet<>();
Integer[] integersArray = new Integer[3];
sets.add(1);
sets.add(2);
sets.add(3);
Integer[] integers = sets.toArray(integersArray);
Stream.of(integersArray).forEach(System.out::println);
}
运行结果:
1
2
3
- 如果指定的数组能容纳 collection 并有剩余空间(即数组的元素比 collection 的元素多),那么会将数组中紧跟在 collection 末尾的元素设置为 null。(这对确定 collection 的长度很有用,但只有 在调用方知道此 collection 没有包含任何 null 元素时才可行。)
- 像 toArray 方法一样,此方法充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。更进一步说,此方法允许在输出数组的运行时类型上进行精确控制,并且在某些情况下,可以用来节省分配开销。
注意
- 如果此 collection 对其迭代器返回的元素顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素。
- 注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。
原理
这里写new Object[0]就是一种类型标记,告诉toArray方法把集合的元素转换成指定Object的数组,由于长度是0,则会生成一个新数组来存在集合中的元素。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100107.html