我想知道为什么他们在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本身的实例有足够的细节来将数据转换成数组。
我的问题是为什么他们仍然需要传入数组?感谢。
答案 0 :(得分:14)
我能想到的两个原因:
ArrayList<String>
知道 它包含字符串,它只是原始类型ArrayList
。因此,toArray()
的所有调用都必须返回Object[]
,这不是严格正确的。你必须实际创建第二个String[]
数组,然后迭代第一个数组,依次输出所有参数以得到所需的结果类型。答案 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。