Câu trả lời:
List<String> list = ..;
String[] array = list.toArray(new String[0]);
Ví dụ:
List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);
Các toArray()
phương pháp mà không đi bất kỳ lợi nhuận luận Object[]
. Vì vậy, bạn phải truyền một mảng làm đối số, sẽ chứa đầy dữ liệu từ danh sách và được trả về. Bạn cũng có thể truyền một mảng trống, nhưng bạn cũng có thể truyền một mảng với kích thước mong muốn.
Cập nhật quan trọng : Ban đầu mã được sử dụng ở trên new String[list.size()]
. Tuy nhiên, blogpost này tiết lộ rằng do tối ưu hóa JVM, sử dụng new String[0]
tốt hơn bây giờ.
Class
đối tượng thực tế , dường như hoàn toàn không thể xuất phát từ loại chung. Lý do cho điều này, như tôi đã nói, là toàn bộ công trình là giả; tất cả chỉ được lưu trữ dưới dạng Object bên trong.
Một thay thế trong Java 8:
String[] strings = list.stream().toArray(String[]::new);
Java 11+:
String[] strings = list.toArray(String[]::new);
toArray
trên một Stream
đối tượng. Lỗi biên dịch này có thể xảy ra nếu bạn giảm luồng bằng cách sử dụng a Collectors
và sau đó thử áp dụng toArray
.
Bạn có thể sử dụng toArray()
phương pháp cho List
:
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = list.toArray(new String[list.size()]);
Hoặc bạn có thể tự thêm các phần tử vào một mảng:
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);
}
Hi vọng điêu nay co ich!
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray = Arrays.copyOf(objectList,objectList.length,String[].class);
Sử dụng copyOf, ArrayList cho mảng cũng có thể được thực hiện.
Bắt đầu từ Java-11, người ta có thể sử dụng API Collection.toArray(IntFunction<T[]> generator)
để đạt được tương tự như:
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
Trong Java 8:
String[] strings = list.parallelStream().toArray(String[]::new);
parallelStream()
thay vì đơn giản stream()
?
Giải pháp Generics để chuyển đổi bất kỳ List<Type>
thành 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;
}
Lưu ý Bạn phải override toString()
phương pháp.
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;
}
trong trường hợp một số thao tác bổ sung của dữ liệu là mong muốn, mà người dùng muốn một hàm, cách tiếp cận này không hoàn hảo (vì nó yêu cầu chuyển lớp của phần tử làm tham số thứ hai), nhưng hoạt động:
nhập java.util.ArrayList; nhập 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()));
}
}
Nếu ứng dụng của bạn đã sử dụng lib Commons của Apache, bạn có thể sửa đổi một chút câu trả lời được chấp nhận để không tạo ra một mảng trống mới mỗi lần:
List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);
Có một vài mảng trống khác preallocated của các loại khác nhau trong ArrayUtils
.
Ngoài ra, chúng ta có thể lừa JVM để tạo mảng trống cho chúng ta theo cách này:
String[] array = list.toArray(ArrayUtils.toArray());
// or if using static import
String[] array = list.toArray(toArray());
Nhưng thực sự không có lợi thế theo cách này, chỉ là vấn đề về hương vị, IMO.
Bạn có thể sử dụng Iterator<String>
để lặp lại các yếu tố của 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();
}
Bây giờ bạn có thể truy xuất các phần tử từ String[]
việc sử dụng bất kỳ Vòng lặp.
.toString()
khi không cần diễn viên rõ ràng, 3. bạn thậm chí không tăng i
và 4. while
tốt hơn nên thay thế bằng a for
. Mã đề xuất: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(); }
Trong Java 11, chúng ta có thể sử dụng Collection.toArray(generator)
phương thức. Đoạn mã sau sẽ tạo ra một chuỗi các chuỗi mới:
List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String [] strArry= list.stream().toArray(size -> new String[size]);
Mỗi bình luận, tôi đã thêm một đoạn để giải thích cách chuyển đổi hoạt động. Đầu tiên, Danh sách được chuyển đổi thành một chuỗi Chuỗi. Sau đó, nó sử dụng Stream.toArray để chuyển đổi các phần tử trong luồng thành một mảng. Trong câu lệnh cuối cùng ở trên "size -> new String [size]" thực sự là một hàm IntFunction phân bổ một mảng String với kích thước của luồng String. Tuyên bố này giống hệt với
IntFunction<String []> allocateFunc = size -> {
return new String[size];
};
String [] strArry= list.stream().toArray(allocateFunc);
Bạn có thể chuyển đổi mảng List thành String bằng cách sử dụng phương thức này:
Object[] stringlist=list.toArray();
Ví dụ đầy đủ:
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;
}
toArray(T[])
tương đương và theo cú pháp tương tựStream.toArray
.