【问题标题】:Standard Place for an Empty String Array in the JDKJDK 中空字符串数组的标准位置
【发布时间】:2011-01-30 09:34:55
【问题描述】:

您好,JDK > 1.5 中是否有访问空数组常量的标准位置。

当我想将字符串集合(例如 ArrayList)转换为字符串数组时,我发现自己在使用自己的 这是在我自己的常量类中定义的:

public static final String[] EMPTY_STRING_ARRAY = new String[0];

然后在我的客户端代码中类似:

String[] retVal = myStringList.toArray(Constants.EMPTY_STRING_ARRAY);
return retVal;

我想知道这是否是“惯用”的做法,或者我是否遗漏了什么 我从我所做的简短搜索中得到的印象是,这种事情在很多人的代码中都很普遍。

非常感谢任何想法、答案、评论(除此之外我不应该真正使用字符串数组),

干杯 西蒙

【问题讨论】:

标签: api java idioms


【解决方案1】:

我会推荐以下代码改进:

String[] retval = myStringList.toArray(new String[myStringList.size()]);

这样,toArray 方法使用提供的、适当大小的数组作为容器,而不是在幕后创建一个新数组。来自 ArrayList javadoc:

如果列表适合指定 数组,它在其中返回。 否则,分配一个新数组 具有指定的运行时类型 数组和这个列表的大小。

【讨论】:

  • 我同意您的回答,但会指出创建数组的位置是学术性的,因为代码中的示例使用共享对象。因此该调用不会生成额外的对象(与调用 ... = list.toArray(new String[0]) 不同,我同意这是低效的)。
  • 感谢您的回复。我有点困惑为什么这是一个改进。所以你说最好在我的代码中明确地编写一些东西来模拟 ArrayList 中“幕后”发生的事情,而不是让它发生在幕后,有可能在 JDK 的未来版本中它可能以某种方式(不要问我如何)被优化?是否仅仅是因为我直接分配了一个新数组,而不是让 ArrayList 通过某种反射机制创建一个(这在现代 jvm 中效率更高)?干杯西蒙
  • 请注意,根据shipilev.net/blog/2016/arrays-wisdom-ancients/#_conclusion,“toArray(new T[0]) 似乎更快、更安全、合同更简洁,因此现在应该是默认选择”。
【解决方案2】:

在任何地方的 JDK 中都没有像这样的数组定义。在 JDK 中执行此操作的唯一两种标准方法是您列出的方法或

String ret[] = new String[myStringList.size()];
myStringList.toArray(ret);
return ret;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-09-30
    • 2014-06-23
    • 2019-06-14
    相关资源
    最近更新 更多