Java中的ArrayList.toArray()方法

时间:2012-03-26 14:33:29

标签: java arrays

我想知道为什么他们在toArray中设计ArrayList方法以在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本身的实例有足够的细节来将数据转换成数组。

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

7 个答案:

答案 0 :(得分:14)

我能想到的两个原因:

  1. Erasure意味着通用参数在运行时不可用,因此ArrayList<String> 知道 它包含字符串,它只是原始类型ArrayList。因此,toArray()的所有调用都必须返回Object[],这不是严格正确的。你必须实际创建第二个String[]数组,然后迭代第一个数组,依次输出所有参数以得到所需的结果类型。
  2. 定义方法的方式意味着您可以传入对现有数组的引用,并通过该方法填充该数组。在某些情况下,这可能非常方便,而不是返回一个新数组,然后将其值复制到别处。

答案 1 :(得分:2)

在您的代码中,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),而编译器会删除泛型,因此运行时系统仍然无法知道它应该在您的内容中创建String[]代码。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

当你有一个非空数组时,你希望从arraylist转换中追加对象,你可以不必创建一个新数组,并进行合并后的处理,节省资源和额外的工作

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

答案 4 :(得分:0)

将Array作为参数传递给toArray()并不是必须的,你可以直接调用 arrayList.toArray()

我们知道带有泛型的Collection框架与 Type Erasure 的概念一起使用。所以arrayList成为Object的列表,所以当你转换为数组时,如果你没有传递任何参数,它将给出 Object []

答案 5 :(得分:0)

鉴于“数据”本身存储在ArrayList数组的存储区中,

Object没有足够的信息。因此,如果您知道阵列列表中的“什么”类型的项目,则可以使用toArray方法的此变体来实现类型安全。

答案 6 :(得分:-1)

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

See this documentation