【问题标题】:ArrayList.toArray() method in JavaJava 中的 ArrayList.toArray() 方法
【发布时间】:2012-04-10 01:47:05
【问题描述】:

我想知道他们为什么要在ArrayList 中设计toArray 方法来获取Java 中数组的输入?

    ArrayList<String> listArray = new ArrayList<String>();

    listArray.add("Germany");
    listArray.add("Holland");
    listArray.add("Sweden");

    String []strArray = new String[3];
    String[] a = (String [])listArray.toArray(strArray);

在我看来,他们不需要这个输入,因为 ArrayList 的实例本身有足够的细节来将数据转换为数组。

我的问题是为什么他们仍然需要传入数组?谢谢。

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    这样,当您有一个非空数组时,您希望从 arraylist 转换中附加对象,您可以这样做而无需创建新数组,并进行合并它的后处理,节省资源和额外的工作。

    阅读 javadoc 的第二段:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray(T[])

    【讨论】:

      【解决方案2】:

      我能想到的两个原因:

      1. 擦除意味着泛型参数在运行时不可用,因此ArrayList&lt;String&gt;知道它包含字符串,它只是原始类型ArrayList。因此toArray() 的所有调用都必须返回Object[],这并不完全正确。您实际上必须创建第二个 String[] 数组,然后遍历第一个数组,依次转换其所有参数以获得所需的结果类型。
      2. 定义方法的方式意味着您可以传入对现有数组的引用,并通过该方法填充它。在某些情况下,这可能非常方便,而不是返回一个新数组,然后将其值复制到其他地方。

      【讨论】:

      • 谢谢,我明白了。在我的示例中,我应该假设“strArray”还是“a”作为最终结果?它们是一样的吗?
      • 它们是相同的,if collection.size() &lt;= strArray.size(),这在您的具体情况下是正确的。无论如何,最好使用a
      • 加 1(因为在 cmets 中禁止 +1):用于在 this 中引入类型擦除的上下文
      【解决方案3】:

      您需要它来获取Object[] 以外的数组类型。 listArray.toArray(new String[3]) 实际上不需要强制转换为 String[],但它允许您写入特定类型的数组,而不是仅将 Object[] 强制转换为任何类型的(相当不安全的)方法。

      【讨论】:

        【解决方案4】:

        不强制将Array作为参数传递给toArray(),可以直接调用ArrayList.toArray()

        我们知道,带有泛型的 Collection 框架使用 Type Erasure 的概念。所以 ArrayList 变成了对象列表,所以当你转换为数组时,如果你不传递任何参数,它会给出一个 Object[]

        【讨论】:

          【解决方案5】:

          ArrayList 没有足够的信息,因为“数据”本身存储在 Object 数组的存储桶中。因此,如果您知道数组列表中有“什么”类型的项目,则可以使用 toArray 方法的这个变体来实现类型安全。

          【讨论】:

            【解决方案6】:

            因为要向 JVM 指定要复制元素的数组。

            See this documentation

            【讨论】:

              【解决方案7】:

              在您的代码中,ArrayList 可以包含任何内容,而不仅仅是字符串。您可以将代码重写为:

              ArrayList<String> listArray = new ArrayList<String>();
              
              listArray.add("Germany");
              listArray.add("Holland");
              listArray.add("Sweden");
              
              String []strArray = new String[3];
              String[] a = listArray.toArray(strArray);
              

              然而,在 Java 中,数组在运行时包含它们的内容类型(字符串),而泛型被编译器擦除,因此运行时系统仍然无法知道它应该在您的代码中创建 String[]

              【讨论】:

                猜你喜欢
                • 2016-08-04
                • 1970-01-01
                • 1970-01-01
                • 2011-05-05
                • 1970-01-01
                • 2011-07-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-11
                相关资源
                最近更新 更多