2011-07-01 80 views
0

Collection。 toArray 我们使用上述方法将List<String>对象转换为等效的String[]Collection.toArray()的正确语法是什么?

List<String> foos = new ArrayList<String>(); 
// foos.toArray(new String[0]); 
// foos.toArray(new String[foos.length]); 

这将是正确的方法来使用,以将其转换成数组。

+0

foos.toArray(新的String [foos.length] );似乎更好... – doNotCheckMyBlog

回答

3

这一个:

foos.toArray(new String[foos.size()]); 

是正确的使用。如果您给toArray一个太短的数组以适合列表,toArray将分配一个新数组,而不是将元素存储在您提供的数组中。这意味着Java将分配两个数组而不是一个,这样会浪费几个时钟周期。

+0

它是foos.size() –

+0

@Maurice:是的,这是正确的。我刚刚从问题中复制了代码... –

2

如果你看到两个函数的签名,你会清楚地看到最后的区别。

Object[] toArray(); 

返回的数组将保持“安全”,因为此集合不会引用它。 (换句话说,即使该集合由数组支持,该方法也必须分配一个新数组)。调用者可以自由修改返回的数组。

此方法充当基于数组和基于集合的API之间的桥梁。

<T> T[] toArray(T[] a); 

a到其中此集合中的元素将被存储,如果它是足够大的阵列;否则,将为此分配一个相同运行时类型的新数组。

+0

所以,我应该使用foos.length,正确吗? – Joe

+0

这一切都取决于你正在工作的集合。在'ArrayList'中最好传递Length。但在'LinkedList'中它不是必需的。 –

+0

但我会建议你应该通过它的长度。 –

1
String array[] = foos.toArray(new String[foos.size()]); 

注意,它也将与新的字符串工作[0],但该阵列将需要被重新分配,如果foos.size()> 0