ChatGPT解决这个技术问题 Extra ChatGPT

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

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

made this answer 采用更新的方法,JDK-11toArray(T[]) 引入了一个新的、性能相同且语法与 Stream.toArray 相似的 API。

F
Floern
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()]。但是,this blogpost 表明由于 JVM 优化,现在使用 new String[0] 更好。


它在 logcat 中显示此警告:Converting to string: TypedValue{t=0x12/d=0x0 a=3 r=0x7f050009}
@ThorbjørnRavnAndersen:数组的大小在功能上没有任何区别,但是如果您以正确的大小传入它,则可以节省 JVM 调整大小的工作。
事实证明,提供一个长度为零的数组,即使是创建它并丢弃它,平均而言比分配正确大小的数组要快。有关基准和解释,请参见此处:shipilev.net/blog/2016/arrays-wisdom-ancients
@StuartMarks 只在 Sun JVM 上测试过让我很恼火。不能保证它在其他系统上会更快,例如 ART(Android 运行时)或 IBM 的 JVM,后者在服务器上使用很多。
@lyuboslavkanev问题是在Java中拥有泛型类型并不足以实际创建基于该类型的对象。甚至不是一个数组(这很荒谬,因为它应该适用于 any 类型)。据我所知,它所能做的就是铸造。事实上,即使要创建该类型的对象,您也需要实际的 Class 对象,这似乎完全不可能从泛型类型派生。正如我所说,这样做的原因是整个结构都是假的。这一切都只是在内部存储为对象。
Z
ZhekaKozlov

Java 8 中的替代方案:

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

Java 11+:

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

或者有什么好处?
我更喜欢这种语法,但 IntelliJ 会显示编译器错误,抱怨“T[] 不是功能接口。”
@GlenMazza 您只能在 Stream 对象上使用 toArray。如果您使用 Collectors 减少流然后尝试应用 toArray,则可能会出现此编译错误。
我不明白。 String[]::new 等同于 () -> new String[]。但是给定的接口方法需要一个整数。不应该是 (list.size()) -> new String[],所以是 String[list.size()]::new 吗?
@JohnStrood String[]::new 相当于 i -> new String[i]。请参阅stackoverflow.com/questions/29447561/…
c
codecubed

您可以对 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);
}

希望这可以帮助!


N
Naman

从 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

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

也可以使用 copyOf,ArrayList 到数组。


建议驼峰式,所以“objectList = ...”和“stringArray”。此外,它是 Arrays.copyOf...capital O。
list.toArray() 内部使用 Arrays.copyOf()
M
Mike Shauneu

在 Java 8 中:

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

这实际上已经包含在 this answer 中。也许将其添加为对该答案的编辑,而不是作为一个全新的答案。
为什么是 parallelStream() 而不是简单的 stream()
K
KayV

在 Java 8 中,可以使用

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

Y
Yoory N.

如果您的应用程序已经在使用 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。


A
Ahmed Ashour

您可以使用 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[] 中检索元素。


我投了反对票,因为:1. 不使用强制你进入的泛型 2. 使用 .toString() 不需要显式强制转换,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(); }
好的,我现在明白了。谢谢。
好吧,理想情况下,您应该编辑代码以包含这些注释(也就是说……如果您认为它们对您的答案有好处!)。在代码保持不变的情况下,我不会考虑删除我的反对票。
我是新来的,所以我还不知道这里的情况如何。虽然,感谢您的帮助伙伴。
这好多了!我只编辑了一点,但您刚刚体验了它的工作原理:提供答案,改进它们,获得桂冠;)
A
Ahmed Ashour

将任何 List<Type> 转换为 String []Generics 解决方案:

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

如果泛型有意义,难道不是“将任何 List 转换为 Type[]”吗?
H
HZhang
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

这可行,但效率不高,并且在接受的答案中使用额外的代码复制了功能。
R
Roberto Attias

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

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

S
Sled

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

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

来自 java.base's java.util.Collection.toArray()


n
nick w.
    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);

这个答案增加了什么价值?它似乎只是重复其他答案而没有解释它为什么回答这个问题。
E
Ernestas Gruodis

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

输出类型错误。
D
Denis Fedak
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;
}