Chuyển đổi 'ArrayList <String> thành' String [] 'trong Java


1024

Làm thế nào tôi có thể chuyển đổi một ArrayList<String>đối tượng thành một String[]mảng trong Java?


2
Đã đưa ra câu trả lời này bằng cách tiếp cận cập nhật với JDK-11 giới thiệu một API mới có hiệu suất toArray(T[])tương đương và theo cú pháp tương tự Stream.toArray.
Naman

Câu trả lời:


1791
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ờ.


16
Liệu kích thước của các đối số làm cho bất kỳ sự khác biệt?
Thorbjørn Ravn Andersen

37
nó tiết kiệm thêm một mảng instnatiation
Bozho

59
Hóa ra việc cung cấp một mảng có độ dài bằng không, thậm chí tạo ra nó và ném nó đi, trung bình nhanh hơn việc phân bổ một mảng có kích thước phù hợp. Để biết điểm chuẩn và giải thích xem tại đây: shipilev.net/blog/2016/arrays-wisdom-ancents
Stuart Marks

2
(. Xin lỗi tu từ Câu hỏi đặt ra câu trả lời là, tất nhiên, bởi vì Java không làm Generics thực, nó chủ yếu chỉ fakes chúng bằng cách đúc Object.)
Nyerguds

3
@lyuboslavkanev Vấn đề là có loại chung trong Java không đủ để thực sự tạo các đối tượng dựa trên loại đó; thậm chí không phải là một mảng (đó là vô lý, bởi vì điều đó sẽ làm việc cho bất kỳ loại nào ). Tất cả những gì có thể được thực hiện với nó, theo như tôi có thể thấy, là đúc. Trong thực tế, để thậm chí tạo các đối tượng của loại, bạn cần phải có 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.
Nyerguds

170

Một thay thế trong Java 8:

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

Java 11+:

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

25
Hoặc bất kỳ lợi ích?
James Watkins

1
Tôi thích cú pháp đó, nhưng IntelliJ hiển thị lỗi trình biên dịch với điều đó, phàn nàn "T [] không phải là giao diện chức năng."
Glen Mazza

3
@GlenMazza bạn chỉ có thể sử dụng toArraytrê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 Collectorsvà sau đó thử áp dụng toArray.
Udara Bentota

39

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!


30
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.


4
Đề xuất camelcase để "objectList = ..." và "stringArray". Ngoài ra, đó là Arrays.copyOf ... thủ đô O.
Jason Weden

1
list.toArray () sử dụng nội bộ Arrays.copyOf ()
David

25

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

10

Trong Java 8:

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

12
Điều này thực sự đã có trong câu trả lời này . Có lẽ thêm nó dưới dạng chỉnh sửa cho câu trả lời đó thay vì như một câu hoàn toàn mới.
Sông

11
Tại sao parallelStream()thay vì đơn giản stream()?
Yoory N.

7

Trong Java 8, nó có thể được thực hiện bằng cách sử dụng

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

6

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

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
Điều này hoạt động, nhưng không hiệu quả, và sao chép chức năng trong câu trả lời được chấp nhận với mã bổ sung.
Alan Delimon

5

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

5

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.


5

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.


Tôi đã từ chối vì: 1. không sử dụng thuốc generic buộc bạn vào 2. sử dụng .toString()khi không cần diễn viên rõ ràng, 3. bạn thậm chí không tăng ivà 4. whiletố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(); }
Olivier Grégoire

Được rồi, tôi hiểu rồi. Cảm ơn.
Vatsal Chavda

Chà, lý tưởng nhất là bạn nên chỉnh sửa mã của mình để đưa vào những bình luận đó (đó là ... nếu bạn nghĩ rằng chúng tốt cho câu trả lời của bạn!). Tôi sẽ không xem xét loại bỏ downvote của mình trong khi mã vẫn không thay đổi.
Olivier Grégoire

Tôi mới ở đây, vì vậy tôi chưa biết mọi thứ hoạt động ở đây như thế nào. Mặc dù, đánh giá cao sự giúp đỡ của bạn.
Vatsal Chavda

Thế này tốt hơn! Tôi đã chỉnh sửa một chút, nhưng bạn vừa trải nghiệm cách thức hoạt động của nó: cung cấp câu trả lời, cải thiện chúng, nhận vòng nguyệt quế;)
Olivier Grégoire

5

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)

từ java.base's java.util.Collection.toArray() .


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

4
Câu trả lời này có giá trị gì? Nó dường như chỉ lặp lại các câu trả lời khác mà không giải thích lý do tại sao nó trả lời câu hỏi.
Richard

2

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

1
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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.