从集合创建数组
java.util.Collection
中的两个方法从集合中创建一个数组:
Object[] toArray()
可以使用如下:
Version >= Java SE 5
Set<String> set = new HashSet<String>();
set.add("red");
set.add("blue");
// although set is a Set<String>, toArray() returns an Object[] not a String[]
Object[] objectArray = set.toArray();
<T> T[] toArray(T[] a)
可以使用如下:
Version >= Java SE 5
Set<String> set = new HashSet<String>();
set.add("red");
set.add("blue");
// The array does not need to be created up front with the correct size.
// Only the array type matters. (If the size is wrong, a new array will
// be created with the same type.)
String[] stringArray = set.toArray(new String[0]);
// If you supply an array of the same size as collection or bigger, it
// will be populated with collection values and returned (new array
// won't be allocated)
String[] stringArray2 = set.toArray(new String[set.size()]);
它们之间的区别不仅仅是具有无类型和类型的结果。它们的性能也可能不同(有关详细信息,请阅读此性能分析部分 ):
Object[] toArray()
使用矢量化的arraycopy
,这比T[] toArray(T[] a)
中使用的经过类型检查的arraycopy
要快得多。T[] toArray(new T[non-zero-size])
需要在运行时将数组清零,而T[] toArray(new T[0])
则不需要。这种避免使后者比前者更快。详细分析: 古代智慧阵列 。
Version >= Java SE 8
从引入了 Stream
概念的 Java SE 8+开始,可以使用集合生成的 Stream
,以便使用 Stream.toArray
方法创建新的数组。
String[] strings = list.stream().toArray(String[]::new);
从两个答案采取(实施例 1 , 2 ),以转换“的 ArrayList 到‘字符串[]’中的 Java 堆栈溢出。