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 toArray는 Stream객체 에서만 사용할 수 있습니다 . 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.