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


Answers:


1787
List<String> list = ..;
String[] array = list.toArray(new String[0]);

例如:

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

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

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


16
参数的大小会有所不同吗?
托尔比约恩Ravn的安徒生

37
它节省了另一个阵列安装时间
博若

59
事实证明,提供一个零长度的数组(甚至创建它并丢弃它)平均比分配合适大小的数组要快。有关基准和解释,请参见此处:shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks

2
(抱歉,修辞问题。答案当然是,因为Java并没有真正的泛型;它只是通过转换Object伪造了它们)
Nyerguds

2
@lyuboslavkanev问题是,在Java中拥有泛型类型不足以实际基于该类型创建对象。甚至都不是数组(这很荒谬,因为它适用于任何类型)。据我所知,它所能完成的全部工作就是铸造。实际上,即使要创建该类型的对象,也需要具有实际的Class对象,而这似乎是不可能从泛型类型派生的。正如我所说,这样做的原因是整个结构都是假的。它们都只是在内部存储为Object。
Nyerguds

170

Java 8中的替代方法:

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

Java 11+:

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

25
还是有什么好处?
James Watkins

1
我希望使用这种语法,但是IntelliJ会显示该错误,并抱怨“ T []不是功能接口”。
Glen Mazza

3
@GlenMazza您只能toArrayStream对象上使用。如果使用a减少流Collectors,然后尝试应用,则可能会发生此编译错误toArray
Udara Bentota

39

您可以将toArray()方法用于List

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

希望这可以帮助!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

使用copyOf,也可以对数组进行ArrayList操作。


4
建议使用驼峰式,所以“ objectList = ...”和“ stringArray”。此外,它是Arrays.copyOf ......资本O.
贾森Weden

1
list.toArray()内部使用Arrays.copyOf()
David

25

从Java-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


7

在Java 8中,可以使用

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

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

注意您必须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);

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

13
这是可行的,但效率不是很高,并且会在接受的答案中使用额外的代码来复制功能。
艾伦·德利蒙

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

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

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

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

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

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

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


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

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


我之所以.toString()投票,是因为:1.不使用会迫使您进入的泛型2. 在不需要显式强制转换的地方使用,3.您甚至不递增i,以及4.用while代替会更好for。建议的代码:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
OlivierGrégoire17年

好吧,我现在知道了。谢谢。
Vatsal Chavda

好吧,理想情况下,您应该编辑代码以包含这些注释(也就是说,如果您认为它们对您的回答很有用!)。在代码保持不变的情况下,我不会考虑删除我的反对意见。
奥利维尔·格雷戈尔

我是新来的,所以我还不知道这里的工作方式。虽然,感谢您的帮助伴侣。
Vatsal Chavda '17

这样好多了!我只编辑了一点,但是您刚刚体验了它的工作原理:提供答案,加以改善,获得桂冠;)
OlivierGrégoire17年


4
    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将流中的元素转换为Array。在上面的最后一个语句中,“ size-> new String [size]”实际上是一个IntFunction函数,该函数分配具有String流大小的String数组。该陈述与

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

4
这个答案增加了什么价值?它似乎只是在重复其他答案,而没有解释它为什么回答这个问题。
理查德

2

您可以使用以下方法将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]);
    }

1
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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.