在toArray(new String [0])中使用new String [0]有什么用;

时间:2013-08-08 21:26:01

标签: java android

嗨我有这样的事情:

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

为什么我们需要new String[0]内的参数toArray

3 个答案:

答案 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 中速度更快)。

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