在Java中将'ArrayList <String>转换为'String []'

Ale*_*lex 962 java arrays string collections arraylist

我如何在Java中将ArrayList<String>对象转换为String[]数组?

Boz*_*zho 1726

List<String> list = ..;
String[] array = list.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

例如:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

toArray()返回没有传递任何参数的方法Object[].所以你必须传递一个数组作为参数,它将填充列表中的数据,然后返回.您也可以传递一个空数组,但也可以传递一个具有所需大小的数组.

重要更新:最初使用上面的代码new String[list.size()].但是,这篇博文显示,由于JVM优化,new String[0]现在使用更好.

  • 事实证明,提供零长度数组,甚至创建并丢弃它,平均比分配正确大小的数组更快.有关基准和解释,请参见此处:http://shipilev.net/blog/2016/arrays-wisdom-ancients/ (56认同)
  • 它节省了一个阵列的实施 (36认同)
  • 参数的大小是否有所不同? (16认同)
  • (对不起.修辞问题.当然,答案是,因为Java没有做真正的泛型;它主要是通过强制转换它来伪造它们) (2认同)
  • @lyuboslavkanev问题是在Java中使用泛型类型不足以实际创建基于该类型的对象; 甚至不是一个数组(这是荒谬的,因为它应该适用于_any_类型).据我所见,所有可以用它完成的就是施法.实际上,要创建该类型的对象,您需要拥有实际的`Class`对象,这似乎完全不可能从泛型类型派生.正如我所说,其原因在于整个建筑都是假的; 它只是内部存储为Object. (2认同)

Vit*_*nko 157

Java 8中的替代方案:

String[] strings = list.stream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

  • 使用这种方法有任何性能优势吗? (29认同)
  • 还是有什么好处? (24认同)
  • @JohnStrood `String[]::new` 相当于 `i -&gt; new String[i]`。请参阅/sf/ask/2061329301/ (4认同)
  • @GlenMazza你只能在`Stream`对象上使用`toArray`.如果使用`Collectors`减少流然后尝试应用`toArray`,则可能发生此编译错误. (3认同)

小智 37

您可以使用以下toArray()方法List:

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

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);
Run Code Online (Sandbox Code Playgroud)

或者您可以手动将元素添加到数组:

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

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


小智 30

ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);
Run Code Online (Sandbox Code Playgroud)

使用copyOf,ArrayList也可以用于数组.

  • 建议使用camelcase"objectList = ..."和"stringArray".此外,它是Arrays.copyOf ...资本O. (4认同)

Nam*_*man 23

从JDK/11开始,可以使用新引入的API Collection.toArray(IntFunction<T[]> generator)来实现相同的目的:

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray
Run Code Online (Sandbox Code Playgroud)


Mik*_*neu 12

在Java 8中:

String[] strings = list.parallelStream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上已包含在[此答案]中(http://stackoverflow.com/a/30302969/3745896).也许可以将其添加为该答案的编辑而不是全新的答案. (12认同)
  • 为什么`parallelStream()`而不是简单的`stream()`? (9认同)

Kay*_*ayV 7

在Java 8中,可以使用

String[] arrayFromList = fromlist.stream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)


Kha*_*ela 6

通用解决方案可将任何秘密转换List<Type>String []

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}
Run Code Online (Sandbox Code Playgroud)

注意您必须override toString()方法。

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);
Run Code Online (Sandbox Code Playgroud)


nic*_* w. 6

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);
Run Code Online (Sandbox Code Playgroud)

根据评论,我添加了一段来解释转换的工作原理。首先,List 被转换为 String 流。然后它使用 Stream.toArray 将流中的元素转换为数组。在上面的最后一条语句中,“size -> new String[size]”实际上是一个 IntFunction 函数,它使用 String 流的大小分配一个 String 数组。该声明与

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有什么价值?它似乎只是重复其他答案,而没有解释为什么它回答了这个问题。 (4认同)

小智 5

List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,但效率不是很高,并且会用额外的代码来复制已接受答案中的功能。 (13认同)

Rob*_*ias 5

如果需要对数据进行一些额外的操作(用户想要一个功能),则此方法并不完美(因为它需要将元素的类作为第二个参数传递),但可以:

导入java.util.ArrayList; 导入java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以Iterator<String>用来迭代的元素ArrayList<String>

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以String[]使用任何Loop 来检索元素。


Yoo*_* N. 5

如果您的应用程序已经在使用Apache Commons lib,则可以稍微修改接受的答案,以免每次都不创建新的空数组:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);
Run Code Online (Sandbox Code Playgroud)

中有更多不同类型的预分配空数组ArrayUtils

我们还可以通过这种方式欺骗JVM为我们创建一个空数组:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());
Run Code Online (Sandbox Code Playgroud)

但是,以这种方式,IMO确实没有任何优势。


Raf*_*iec 5

在Java 11中,我们可以使用该Collection.toArray(generator)方法。以下代码将创建一个新的字符串数组:

List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)
Run Code Online (Sandbox Code Playgroud)

java.base的 java.util.Collection.toArray()