在 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<String>
对象转换为 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<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
【讨论】:
【参考方案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
等价于 () -> new String[]
。但是给定的接口方法需要一个整数。不应该是(list.size()) -> new String[]
,所以String[list.size()]::new
?
@JohnStrood String[]::new
等价于 i -> 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<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);
【讨论】:
如果generics有含义,那岂不是“将任意List您可以使用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();
好的,我知道了。谢谢。
好吧,理想情况下,您应该编辑您的代码以包含这些 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 数据类型插入 MySQL 数据库
如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到 C++ Vector<array<float,size>>?