Java에서 'ArrayList <String>을'String [] '로 변환


1022

Java에서 ArrayList<String>객체를 String[]배열 로 변환하려면 어떻게 해야합니까?


2
유무는 이 대답을했다 와 업데이트 된 접근 방식 JDK-11 에 새로운에게 동등하게 확대됨에 API를 도입 toArray(T[])하고하는 구문과 유사 Stream.toArray.
Naman

답변:


1789
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()]. 그러나이 블로그 포스트 는 JVM 최적화로 인해 사용 new String[0]이 더 나은 것으로 나타났습니다 .


16
논증의 크기에 차이가 있습니까?
Thorbjørn Ravn Andersen 13:15에

37
그것은 하나 이상의 배열 instnatiation를 저장
Bozho

59
길이가 0 인 배열을 제공하고 생성하여 버리는 것이 올바른 크기의 배열을 할당하는 것보다 평균 빠릅니다. 벤치 마크 및 설명은 여기를 참조하십시오 : shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks

2
(죄송합니다. 수사학적인 질문입니다. 물론 대답은 Java가 실제 제네릭을 수행하지 않기 때문에 대부분 객체를 캐스팅하여 가짜로 만드는 것입니다)
Nyerguds

3
@lyuboslavkanev 문제는 Java에서 제네릭 형식을 갖는 것만으로는 해당 형식에 따라 개체를 실제로 만들 수 없다는 것입니다. 배열조차도 ( 어떤 유형 에 대해서도 작동하기 때문에 말도 안됩니다 ). 내가 볼 수있는 한, 그것으로 할 수있는 것은 캐스팅입니다. 사실, 유형의 객체를 만들려면 실제 Class객체 가 있어야합니다 . 일반 객체에서 파생하는 것이 완전히 불가능한 것 같습니다. 내가 말했듯이 그 이유는 전체 구조가 가짜이기 때문입니다. 모두 내부적으로 Object로 저장됩니다.
Nyerguds

170

Java 8의 대안 :

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

자바 11+ :

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

25
아니면 어떤 혜택?
James Watkins

1
이 구문을 선호하지만 IntelliJ는 컴파일러 오류를 표시하고 "T []는 기능적인 인터페이스가 아닙니다"라고 불평합니다.
Glen Mazza

3
@GlenMazza toArrayStream객체 에서만 사용할 수 있습니다 . a를 사용하여 스트림을 줄이고 Collectors적용하려고 하면이 컴파일 오류가 발생할 수 있습니다 toArray.
Udara Bentota

39

다음 toArray()방법을 사용할 수 있습니다 List.

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

도움이 되었기를 바랍니다!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

copyOf, ArrayList를 사용하여 배열을 수행 할 수도 있습니다.


4
"objectList = ..."및 "stringArray"가되도록 낙타를 제안하십시오. 또한 Arrays.copyOf ... capital O입니다.
Jason Weden

1
list.toArray ()는 내부적으로 Arrays.copyOf ()를 사용합니다
David

25

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

10

자바 8 :

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

12
이것은 이미이 답변에 포함되어 있습니다. 아마도 완전히 새로운 답변 대신 해당 답변에 대한 편집으로 추가 할 수 있습니다.
River

11
parallelStream()단순히 대신에 stream()?
Yoory N.

7

Java 8에서는 다음을 사용하여 수행 할 수 있습니다

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

6

제네릭 솔루션은 어떤 은밀한 할 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);

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

13
이것은 작동하지만 매우 효율적이지 않으며 추가 코드로 허용되는 답변의 기능을 복제합니다.
Alan Delimon

5

사용자가 함수를 원하는 데이터를 추가로 조작 해야하는 경우이 방법은 완벽하지는 않지만 (요소의 클래스를 두 번째 매개 변수로 전달해야하므로) 작동합니다.

import java.util.ArrayList; import 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

애플리케이션이 이미 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와 같은 이점이 없습니다.


5

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.로 당신을 강제로 제네릭 사용하지 않음 : 나는 때문에을 downvoted .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(); }
Olivier Grégoire

알았어, 지금 알았어 감사.
Vatsal Chavda

글쎄, 이상적으로는 주석을 포함하도록 코드를 편집해야합니다 (즉 ... 응답에 좋다고 생각하면!). 코드가 변경되지 않은 상태에서 downvote를 제거하는 것을 고려하지 않습니다.
Olivier Grégoire

나는 여기에 처음이므로 어떻게 작동하는지 아직 모르겠습니다. 도움을 주셔서 감사합니다.
Vatsal Chavda

이것은 훨씬 낫다! 나는 약간 편집했지만, 당신은 그것이 작동하는 방법을 경험했습니다 : 답변을 제공하고, 향상시키고, 월계수를 얻으십시오;)
Olivier Grégoire


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

의견에 따라 전환이 어떻게 작동하는지 설명하는 단락을 추가했습니다. 먼저 List가 문자열 스트림으로 변환됩니다. 그런 다음 Stream.toArray를 사용하여 스트림의 요소를 Array로 변환합니다. 위의 마지막 명령문에서 "size-> new String [size]"는 실제로 String 스트림의 크기로 String 배열을 할당하는 IntFunction 함수입니다. 그 진술은

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
이 답변은 어떤 가치를 더합니까? 왜 질문에 대답하는지 설명하지 않고 다른 답변을 반복하는 것처럼 보입니다.
Richard

2

이 방법을 사용하여 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]);
    }

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.