【问题标题】:Convert list to array in Java [duplicate]在Java中将列表转换为数组[重复]
【发布时间】:2012-03-23 06:54:22
【问题描述】:

如何在 Java 中将 List 转换为 Array

检查下面的代码:

ArrayList<Tienda> tiendas;
List<Tienda> tiendasList; 
tiendas = new ArrayList<Tienda>();

Resources res = this.getBaseContext().getResources();
XMLParser saxparser =  new XMLParser(marca,res);

tiendasList = saxparser.parse(marca,res);
tiendas = tiendasList.toArray();

this.adaptador = new adaptadorMarca(this, R.layout.filamarca, tiendas);
setListAdapter(this.adaptador);  

我需要用tiendasList 的值填充数组tiendas

【问题讨论】:

  • ArrayList 不是数组。 Tienda[] 将是一个数组。

标签: java arrays list arraylist


【解决方案1】:

要么:

Foo[] array = list.toArray(new Foo[0]);

或:

Foo[] array = new Foo[list.size()];
list.toArray(array); // fill the array

请注意,这仅适用于引用类型的数组。对于原始类型的数组,使用传统方式:

List<Integer> list = ...;
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++) array[i] = list.get(i);

更新:

现在建议使用list.toArray(new Foo[0]);,而不是list.toArray(new Foo[list.size()]);

来自 JetBrains Intellij Idea 检查:

将集合转换为数组有两种样式:使用 预先确定大小的数组(如 c.toArray(new String[c.size()]))或 使用空数组(如 c.toArray(new String[0])

在 建议使用预先确定大小的数组的旧 Java 版本,因为 反射调用,这是创建适当大小的数组所必需的 很慢。但是,由于 OpenJDK 6 的更新较晚,因此此调用 被内化了,使得空数组版本的性能 与预尺寸的相比,相同,有时甚至更好 版本。此外,传递预定大小的数组对于并发或 作为数据竞争的同步收集是可能的 sizetoArray 调用可能会导致额外的空值 在数组的末尾,如果集合同时收缩 在操作过程中。

此检查允许遵循 统一样式:使用空数组(推荐在 现代 Java)或使用预先确定大小的数组(在 较旧的 Java 版本或非基于 HotSpot 的 JVM)。

【讨论】:

  • 对于第一种形式,我更喜欢list.toArray(new Foo[0]),因为这清楚地表明参数仅用于类型信息,大小无关紧要。
  • @MarcusJuniusBrutus 不,你错了。如果您使用的是new Foo[0],那么您正在创建一个额外的无用数组。检查源代码进行验证。
  • 为什么不只是Foo[] array = list.toArray(); 超出了我的想象。
  • @Diederik 因为list.toArray() 返回Object[] 而不是Foo[]
  • @Diederik 不幸的是,Java 的泛型集合与其非泛型集合共享类的副作用。 Collection.toArray() 在 Java 1.0 或 1.1 中被定义为返回 Object[],现在改变它为时已晚。有点让我希望 Java 使用不同的泛型集合来避免这种疯狂。
【解决方案2】:

Java 8 中的替代方案:

String[] strings = list.stream().toArray(String[]::new);

从 Java 11 开始:

String[] strings = list.toArray(String[]::new);

【讨论】:

  • 但是在这种特殊情况下使用 Stream 更好吗?
  • 这个问题被标记为android,也许你想在stackoverflow.com/questions/4042434/…写你对纯java问题的答案
  • @PhoneixS 和 gradle-retrolambda 现在可以使用 java 8 功能了。
  • 在 C# 中:list.ToArray(); //没有进一步的评论:/
  • 如果在toArray 之前使用mapToDouble 之类的方法,则适用于原始数组
【解决方案3】:

我认为这是最简单的方法:

Foo[] array = list.toArray(new Foo[0]);

【讨论】:

  • 也许设置正确的数组大小,你显然知道
  • ^ 如果这是预期的样式,则无需设置数组的大小。 toArray(T[] a) 的文档:If the list fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this list.
  • @SuZhang If the list fits in the specified array.确保列表不适合传递的数组new Foo[0](除非列表本身为空),并且将创建一个新数组来保存列表项。您只是传递数组的类型(而对象本身是无用的)。
  • @Eng.Fouad 我应该明确表示我正在回复 Oskar Kjellin:P
  • 如果传入的数组太小,toArray() 方法必须使用反射构造一个合适大小的新数组。与传递至少与集合本身大小相同的数组相比,这具有明显更差的性能。来源:Intellij 验货:git.jetbrains.org/?p=idea/community.git;a=blob;f=plugins/…
【解决方案4】:

在没有 Java 8 的情况下我想到的最好的事情是:

public static <T> T[] toArray(List<T> list, Class<T> objectClass) {
    if (list == null) {
        return null;
    }

    T[] listAsArray = (T[]) Array.newInstance(objectClass, list.size());
    list.toArray(listAsArray);
    return listAsArray;
}

如果有人有更好的方法,请分享:)

【讨论】:

    【解决方案5】:

    我遇到了解决它的这段代码sn-p。

    //Creating a sample ArrayList 
    List<Long> list = new ArrayList<Long>();
    
    //Adding some long type values
    list.add(100l);
    list.add(200l);
    list.add(300l);
    
    //Converting the ArrayList to a Long
    Long[] array = (Long[]) list.toArray(new Long[list.size()]);
    
    //Printing the results
    System.out.println(array[0] + " " + array[1] + " " + array[2]);
    

    转换工作如下:

    1. 它创建一个新的 Long 数组,其大小与原始列表相同
    2. 它使用新创建的将原始 ArrayList 转换为数组
    3. 它将该数组转换为一个长数组 (Long[]),我将其命名为“数组”

    【讨论】:

    • 发布其他人的无需任何代码 cmets 或解释即可工作的代码并不是一个非常有说服力的答案(但不是 -1,因为它在技术上是正确的)。
    • 您的评论无论如何都会导致其他人对我的回答投反对票。
    • 虽然技术上是正确的,但这个解决方案是多余的;您需要 (Long[]) 演员表或 toArraynew Long[list.size()] 参数,但不能同时使用!
    【解决方案6】:

    这是有效的。有点。

    public static Object[] toArray(List<?> a) {
        Object[] arr = new Object[a.size()];
        for (int i = 0; i < a.size(); i++)
            arr[i] = a.get(i);
        return arr;
    }
    

    然后是main方法。

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>() {{
            add("hello");
            add("world");
        }};
        Object[] arr = toArray(list);
        System.out.println(arr[0]);
    }
    

    【讨论】:

      【解决方案7】:

      对于 ArrayList,以下工作:

      ArrayList<Foo> list = new ArrayList<Foo>();
      
      //... add values
      
      Foo[] resultArray = new Foo[list.size()];
      resultArray = list.toArray(resultArray);
      

      【讨论】:

        【解决方案8】:

        来自此页面的示例:http://www.java-examples.com/copy-all-elements-java-arraylist-object-array-example

        import java.util.ArrayList;
        
        public class CopyElementsOfArrayListToArrayExample {
        
          public static void main(String[] args) {
            //create an ArrayList object
            ArrayList arrayList = new ArrayList();
        
            //Add elements to ArrayList
            arrayList.add("1");
            arrayList.add("2");
            arrayList.add("3");
            arrayList.add("4");
            arrayList.add("5");
        
            /*
              To copy all elements of java ArrayList object into array use
              Object[] toArray() method.
            */
        
            Object[] objArray = arrayList.toArray();
        
            //display contents of Object array
            System.out.println("ArrayList elements are copied into an Array.
                                                          Now Array Contains..");
            for(int index=0; index < objArray.length ; index++)
              System.out.println(objArray[index]);
          }
        }
        
        /*
        Output would be
        ArrayList elements are copied into an Array. Now Array Contains..
        1
        2
        3
        4
        5
        

        【讨论】:

        【解决方案9】:

        你可以使用toArray() api如下,

        ArrayList<String> stringList = new ArrayList<String>();
        stringList.add("ListItem1");
        stringList.add("ListItem2");
        String[] stringArray = new String[stringList.size()];
        stringArray = stringList.toArray(stringList);
        

        数组中的值是,

        for(String value : stringList)
        {
            System.out.println(value);
        }
        

        【讨论】:

          【解决方案10】:

          这个(Ondrej 的回答):

          Foo[] array = list.toArray(new Foo[0]);
          

          是我看到的最常见的成语。那些建议您使用实际列表大小而不是“0”的人误解了这里发生的事情。 toArray 调用不关心给定数组的大小或内容——它只需要它的类型。如果它采用实际类型会更好,在这种情况下,“Foo.class”会更清晰。是的,这个习语会生成一个虚拟对象,但包含列表大小只是意味着您生成了一个更大的虚拟对象。同样,该对象不以任何方式使用;它只是需要的类型。

          【讨论】:

          • 您需要查看源代码。如果您使用new Foo[0],则数组new Foo[0] 将被忽略,并且将创建一个适当大小的新数组。如果您使用new Foo[list.size()],那么数组new Foo[list.size()] 将被填充,并且不会创建其他数组。
          【解决方案11】:

          试试这个:

          List list = new ArrayList();
          list.add("Apple");
          list.add("Banana");
          
          Object[] ol = list.toArray();
          

          【讨论】:

          • 没用,因为通常使用泛型类型。
          猜你喜欢
          • 2017-06-02
          • 2013-02-16
          • 1970-01-01
          • 2011-02-06
          • 2019-01-21
          • 2014-07-14
          • 2017-02-13
          • 2015-06-23
          相关资源
          最近更新 更多