为什么我们需要new String[0]
里面的论点toArray
?
saved = getSharedPreferences("searches", MODE_PRIVATE);
String[] mystring = saved.getAll().keySet().toArray(new String[0]);
让你找回一个String[]
. 没有任何争论的人会给你一个Object[]
.
看到你有这个方法的 2 个版本:
通过传递String[]
数组,您使用的是通用版本。
传递String[]
数组的更好方法是使用 的大小而不是大小 0 来初始化它Set
,这样就不需要在方法中创建新数组:
Set<String> set = saved.getAll().keySet();
String[] mystring = set.toArray(new String[set.size()]);
它是为返回提供一种类型并防止任何编译时歧义。
该方法调用的签名是:<T> T[] toArray(T[] a)
而空参数一是Object[] toArray()
为了向已接受的答案添加更多细节,一些 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 中可能更快)。
希望它有助于进一步理解为什么事情会以某种方式完成。