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