【问题标题】:Transforming an ArrayList to an Array using toArray() method使用 toArray() 方法将 ArrayList 转换为 Array
【发布时间】:2015-11-10 11:10:02
【问题描述】:

考虑以下代码:

 import java.util.*;

 public class ArrayQuestion{
        public static void main(String[] args){
               List<String> list = new ArrayList<>();
               list.add("Chocolate");
               list.add("Vanilla");
        //Converting the List to an Array
        Object[] objectArray = list.toArray();

所以 toArray 方法返回一个默认类型 Object[] 的数组。 假设我想创建一个 String 数组,我读到我会将一个 string[] 对象传递给 toArray 方法。

        String[] stringArray = list.toArray(new String[0]);

我了解到为参数指定大小为 0 的好处是 Java 将 为返回值创建一个大小合适的新数组

有人可以解释一下吗,我在 Java API 中查找了 toArray(String[] stringArray) 方法。我仍然不明白上面的语句所暗示的返回值是什么。

我的问题是关于传递给 toArray 方法的参数以及为什么它是 0 以及传递 0 如何创建一个适当大小的列表的数组。

【问题讨论】:

  • 正确的方法是T[] myArray = list.toArray(new T[list.size()]);。你的问题到底是什么?
  • source code 可能会对您有所帮助。
  • @singhakash 谢谢,这正是我需要的

标签: java arrays list toarray


【解决方案1】:

当您将一个太小的数组传递给 toArray 方法时,它会创建一个相同类但大小正确的数组。一个空数组(长度为 0)非常适合。

【讨论】:

  • 谢谢,我刚刚对 hexafraction 的回答发表了评论,我向下滚动,您已经回答了我的问题。
【解决方案2】:

列表的返回值将赋值给stringArray。例如,如果 list 包含 15 个字符串,则调用 list.toArray(new String[0]) 将返回具有 15 个元素的 String[]

这是一个包含更多细节的引用,直接来自 javadoc:

以正确的方式返回包含此列表中所有元素的数组 序列(从第一个到最后一个元素);的运行时类型 返回的数组是指定数组的数组。 如果列表适合 指定数组,在其中返回。否则,一个新数组是 分配有指定数组的运行时类型和大小 这个列表。

如果列表适合指定的数组并有剩余空间(即 数组的元素多于列表),数组中的元素 集合结束后立即设置为 null。 (这 仅当调用者在确定列表的长度时才有用 知道列表不包含任何空元素。)

【讨论】:

  • @RamanSB 如果您仔细阅读我引用的 javadoc,您会发现前者是这种情况。任何传入的数组太短都会导致返回一个新数组。
【解决方案3】:

查看例如 LinkedList 的实现

public <T> T[] toArray(T[] a) {
    if (a.length < size)
        a = (T[])java.lang.reflect.Array.newInstance(
                            a.getClass().getComponentType(), size);
    int i = 0;
    Object[] result = a;
    for (Node<E> x = first; x != null; x = x.next)
        result[i++] = x.item;
    if (a.length > size)
        a[size] = null;
    return a;
}

行为应该从那里很清楚。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2013-03-28
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2013-02-13
    相关资源
    最近更新 更多