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

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

883292 次浏览
List<String> list = ..;String[] array = list.toArray(new String[0]);

例如:

List<String> list = new ArrayList<String>();//add some stufflist.add("android");list.add("apple");String[] stringArray = list.toArray(new String[0]);

不传递任何参数的toArray()方法返回Object[]。因此,您必须将数组作为参数传递,该数组将使用列表中的数据填充并返回。您也可以传递一个空数组,但您也可以传递一个具有所需大小的数组。

重要更新:最初上面的代码使用new String[list.size()]。然而,这篇博客表明,由于JVM优化,现在使用new String[0]更好。

List <String> list = ...String[] array = new String[list.size()];int i=0;for(String s: list){array[i++] = s;}
ArrayList<String> arrayList = new ArrayList<String>();Object[] objectList = arrayList.toArray();String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

使用CopyOf,数组的ArrayList也可以完成。

第8Java:

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

Java11+:

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

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

ArrayList<String> list = new ArrayList<String>();
list.add("apple");list.add("banana");
String[] array = list.toArray(new String[list.size()]);

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

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);}

希望这有帮助!

Java8:

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

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

java.util.ArrayList;导入java.lang.reflect.数组;

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()));}}

泛型隐藏任何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;}

说明您必须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);

您可以使用#0迭代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();}

现在您可以使用任何循环从String[]检索元素。

private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {String[] delivery = new String[deliveryServices.size()];for (int i = 0; i < deliveryServices.size(); i++) {delivery[i] = deliveryServices.get(i).getName();}return delivery;}

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

List<String> list = ..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);

ArrayUtils中还有一些不同类型的预分配空数组。

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

String[] array = list.toArray(ArrayUtils.toArray());
// or if using static importString[] array = list.toArray(toArray());

但这种方式真的没有优势,只是品味问题,IMO。

您可以使用此方法将List转换为String数组:

 Object[] stringlist=list.toArray();

完整示例:

ArrayList<String> list=new ArrayList<>();list.add("Abc");list.add("xyz");
Object[] stringlist=list.toArray();
for(int i = 0; i < stringlist.length ; i++){Log.wtf("list data:",(String)stringlist[i]);}

从Java-11开始,可以使用API#0来实现相同的功能:

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

在Java8中,可以使用

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

在Java11中,我们可以使用Collection.toArray(generator)方法。

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

java.base#0

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

根据评论,我添加了一段来解释转换的工作原理。首先,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);