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

use*_*401 12 java android

嗨我有这样的事情:

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)

  • @DanBrandt 我相信在 Java 8 中使用空数组实际上更有效。/sf/answers/2061121611/ (6认同)
  • 我个人总是发现这个要求很奇怪,传递`Class.class`对我来说更有意义 (3认同)
  • 理想情况下,您应该将数组初始化为正确的大小,以便可以填充它.否则,将创建一个新数组. (2认同)
  • @SamBarnum有谁知道,为什么 Intellij IDEA (2018.1, 2019.2) [提供](https://pastenow.ru/74XPE) 正是一个**空**数组? (2认同)

Arn*_*LLY 9

为了向已接受的答案添加更多详细信息,一些 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 中可能更快)。

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


Ada*_*gin 5

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

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

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