嗨我有这样的事情:
saved = getSharedPreferences("searches", MODE_PRIVATE);
String[] mystring = saved.getAll().keySet().toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
为什么我们需要new String[0]
内部的论证toArray
?
Roh*_*ain 25
所以你回来了String[]
.没有任何争论的那个给你一个回复Object[]
.
看到你有这个方法的2个版本:
通过传递String[]
数组,您使用的是通用版本.
传递String[]
数组的更好方法是使用大小初始化它Set
,而不是大小为0,这样就不需要在方法中创建新数组:
Set<String> set = saved.getAll().keySet();
String[] mystring = set.toArray(new String[set.size()]);
Run Code Online (Sandbox Code Playgroud)
为了向已接受的答案添加更多详细信息,一些 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 中可能更快)。
希望它有助于进一步理解为什么事情会以某种方式完成。
归档时间: |
|
查看次数: |
18356 次 |
最近记录: |