【问题标题】:Why do you need to specify an array to Set.toArray, which returns an array?为什么需要给Set.toArray指定一个数组,返回一个数组呢?
【发布时间】:2012-08-09 23:56:47
【问题描述】:

我对 Set(和其他集合)中 toArray(T[]) 方法的设计和正确使用感到困惑。如果我有一个字符串集合,如果方法要分配一个新的字符串数组,为什么我需要指定一个大小为 0 的字符串数组?

Set<String> stringSet = new Set<String>();
// bla bla bla, insert Strings to set
String[] array = stringSet.toArray(new String[0]);

有没有更好的方法来获取数组而不分配额外的数组或显式类型转换?

【问题讨论】:

  • 最好写:stringSet.toArray(new String[stringSet.size()]); 以避免不必要的对象创建。
  • @assyliass 我真的怀疑虚拟机会“强调”额外的new String[0](它实际上会非常有效地处理它,因为它是一个短暂的对象),这是为了简单起见..如果有 any 测试用例可以另外争论,我真的会感到惊讶,除非 same 数组被重新使用。 (复制操作本身比为任何可观的n 创建一个新的空数组“工作量更大”,并且随着n 的增长,额外的分配变得越来越不重要。)

标签: java arrays string collections


【解决方案1】:

该参数用于检测将要创建的数组的类型。

你可能会争论,为什么 JVM 不使用 stringSet 的泛型类型参数来检测类型。答案是在运行时泛型类型参数由于类型擦除而未知,即 Set 在编译后变为 Set。

toArray(new Object[0]) 在功能上与 toArray() 相同。

如果集合适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和该集合的大小分配一个新数组。

【讨论】:

  • 我明白了。只需要一个空数组来获取类型,这听起来很骇人听闻。
  • 如果数组不是零长度的,会被复用
  • @Razvan 如果数组足够大,它将被重用..(来自the javadoc)“这个集合的元素将被存储到的数组,如果它足够大;否则,为此目的分配一个相同运行时类型的新数组"
【解决方案2】:

如果您使用集合,您可能不知道您的set(或任何其他集合)将拥有的确切条目数。如果你从一开始就知道条目的数量,为什么不使用数组而不是集合呢?

在我看来,toArray() 方法是一种使用您不知道先验有多少条目的集合创建数组的简单方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2012-08-26
    • 1970-01-01
    • 2020-08-07
    • 2012-05-17
    相关资源
    最近更新 更多