26

为什么我们需要new String[0]里面的论点toArray

saved = getSharedPreferences("searches", MODE_PRIVATE);
String[] mystring = saved.getAll().keySet().toArray(new String[0]);
4

3 回答 3

36

让你找回一个String[]. 没有任何争论的人会给你一个Object[].

看到你有这个方法的 2 个版本:

通过传递String[]数组,您使用的是通用版本。


传递String[]数组的更好方法是使用 的大小而不是大小 0 来初始化它Set,这样就不需要在方法中创建新数组:

Set<String> set = saved.getAll().keySet();
String[] mystring = set.toArray(new String[set.size()]);
于 2013-08-08T21:27:09.280 回答
5

它是为返回提供一种类型并防止任何编译时歧义。

该方法调用的签名是:<T> T[] toArray(T[] a)

而空参数一是Object[] toArray()

于 2013-08-08T21:28:54.247 回答
2

为了向已接受的答案添加更多细节,一些 IDE(此处为 IntelliJ)提供了有用的评论和解释,说明为什么在使用new String[c.size()]与使用new String[0]作为toArray方法的参数时它们会在主动检查时发出警告:

将集合转换为数组有两种样式:使用预先确定大小的数组(如c.toArray(new String[c.size()])或使用空数组(如c.toArray(new String[0]). 在较旧的 Java 版本中,建议使用预先确定大小的数组,因为创建适当大小的数组所必需的反射调用非常慢。然而,由于 OpenJDK 6 的更新较晚,这个调用被内化了,使得空数组版本的性能与预先调整大小的版本相同,有时甚至更好。此外,传递预先确定大小的数组对于并发或同步集合也是危险的,因为在 size 和 toArray 调用之间可能存在数据竞争,如果在操作期间集合同时收缩,这可能会导致数组末尾出现额外的空值。此检查允许遵循统一的样式:使用空数组(在现代 Java 中推荐)或使用预先确定大小的数组(在较旧的 Java 版本或非基于 HotSpot 的 JVM 中可能更快)。

希望它有助于进一步理解为什么事情会以某种方式完成。

于 2021-01-26T13:38:27.903 回答