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

Posted

技术标签:

【中文标题】在 Java 中将 \'ArrayList<String> 转换为 \'String[]\'【英文标题】:Converting 'ArrayList<String> to 'String[]' in Java在 Java 中将 'ArrayList<String> 转换为 'String[]' 【发布时间】:2011-05-01 20:13:41 【问题描述】:

如何在 Java 中将 ArrayList&lt;String&gt; 对象转换为 String[] 数组?

【问题讨论】:

让made this answer 采用更新的方法,使用 JDK-11 引入与toArray(T[]) 同等性能的新 API,语法与 Stream.toArray 相似。 【参考方案1】:

有两种方法可以在 Java 中转换 List to Array。

    toArray() toArray(T[] arr)

这是示例程序:

import java.util.*;
 
public class Scaler 
 
   public static void main(String[] args) 
       ArrayList<Integer> list = new ArrayList<>();
       list.add(1);
       list.add(2);
       list.add(3);
       list.add(4);
       //Implementing the first way to convert list to array in java
       Object[] res1Arr=list.toArray();
       //Implementing the second way to convert list to array in java
       Integer[] res2Arr = new Integer[4];
       list.toArray(res2Arr);
       //Printing the first array
       System.out.println("Printing 'res1Arr':");
           for(Object obj: res1Arr)
           //Typecasting required for the first method
               System.out.println((Integer)obj);
       //Printing the second array
       System.out.println("Printing 'res2Arr':");
           for(Integer i: res2Arr)
               System.out.println(i);
   

【讨论】:

【参考方案2】:

从 Java-11 开始,可以使用 API Collection.toArray(IntFunction&lt;T[]&gt; 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

【讨论】:

【参考方案3】:

arraylist转array我们有以下三种方式

    public T[] toArray(T[] a) - 这样我们将创建一个列表大小的数组,然后放入方法为 String[] arr = new String[list.size()];

    arr = list.toArray(arr);

    公共 get() 方法 - 这样我们迭代列表并将元素一个一个放入数组中

参考: How to convert ArrayList To Array In Java

【讨论】:

【参考方案4】:
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

每个 cmets,我添加了一段来解释转换是如何工作的。 首先,将 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);

【讨论】:

这个答案有什么价值?它似乎只是重复其他答案而没有解释它为什么回答这个问题。【参考方案5】:

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 等价于 () -&gt; new String[]。但是给定的接口方法需要一个整数。不应该是(list.size()) -&gt; new String[],所以String[list.size()]::new @JohnStrood String[]::new 等价于 i -&gt; new String[i]。见***.com/questions/29447561/…【参考方案6】:

在 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()

【讨论】:

【参考方案7】:

在 Java 8 中,可以使用

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

泛型解决方案将任何List&lt;Type&gt; 转换为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);

【讨论】:

如果generics有含义,那岂不是“将任意List转换为Type[]”?【参考方案10】:

您可以使用Iterator&lt;String&gt;来迭代ArrayList&lt;String&gt;的元素:

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&lt;String&gt; stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator&lt;String&gt; it = stringList.iterator(); it.hasNext(); i++) stringArray[i] = it.next(); 好的,我知道了。谢谢。 好吧,理想情况下,您应该编辑您的代码以包含这些 cmets(也就是说……如果您认为它们对您的答案有好处!)。在代码保持不变的情况下,我不会考虑删除我的反对票。 我是新来的,所以我还不知道这里的情况如何。不过,感谢您的帮助伙伴。 这样好多了!我只编辑了一点,但您刚刚体验了它的工作原理:提供答案,改进它们,获得桂冠;)【参考方案11】:

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

【讨论】:

【参考方案12】:
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;

【讨论】:

【参考方案13】:

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

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

【讨论】:

【参考方案14】:
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: TypedValuet=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 对象,这似乎完全不可能从泛型类型派生。正如我所说,这样做的原因是整个结构都是假的。这一切都只是在内部存储为对象。【参考方案15】:

在 Java 8 中:

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

【讨论】:

这确实已经包含在this answer 中。也许将其添加为对该答案的编辑,而不是作为一个全新的答案。 为什么是parallelStream() 而不是简单的stream()【参考方案16】:

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

希望这会有所帮助!

【讨论】:

【参考方案17】:
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()【参考方案18】:
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list)
  array[i++] = s;

【讨论】:

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

以上是关于在 Java 中将 'ArrayList<String> 转换为 'String[]'的主要内容,如果未能解决你的问题,请参考以下文章

在java中将字符串转换为arraylist <Character>

在java中将多个项目添加到已经初始化的arraylist

如何在 Java 中将 ArrayList 数据类型插入 MySQL 数据库

如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到 C++ Vector<array<float,size>>?

如何在 Java 中将对象添加到 ArrayList

在Java中将文件的内容保存为字符串?