如何在 Java 中将 ArrayList<String>
对象转换为 String[]
数组?
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]
更好。
Java 8 中的替代方案:
String[] strings = list.stream().toArray(String[]::new);
Java 11+:
String[] strings = list.toArray(String[]::new);
Stream
对象上使用 toArray
。如果您使用 Collectors
减少流然后尝试应用 toArray
,则可能会出现此编译错误。
String[]::new
等同于 () -> new String[]
。但是给定的接口方法需要一个整数。不应该是 (list.size()) -> new String[]
,所以是 String[list.size()]::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);
}
希望这可以帮助!
从 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
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray = Arrays.copyOf(objectList,objectList.length,String[].class);
也可以使用 copyOf,ArrayList 到数组。
在 Java 8 中:
String[] strings = list.parallelStream().toArray(String[]::new);
parallelStream()
而不是简单的 stream()
?
在 Java 8 中,可以使用
String[] arrayFromList = fromlist.stream().toArray(String[]::new);
如果您的应用程序已经在使用 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。
您可以使用 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[]
中检索元素。
.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(); }
将任何 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 <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
array[i++] = s;
}
如果需要对数据进行一些额外的操作,而用户想要一个函数,这种方法并不完美(因为它需要将元素的类作为第二个参数传递),但是可以:
导入 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()));
}
}
在 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()
。
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);
您可以使用此方法将 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]);
}
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;
}
Class
对象,这似乎完全不可能从泛型类型派生。正如我所说,这样做的原因是整个结构都是假的。这一切都只是在内部存储为对象。