Java에서 배열을 목록으로 변환


1027

Java에서 배열을 목록으로 변환하는 방법

나는 사용 Arrays.asList()했지만 동작 (및 서명)은 어떻게 든 Java SE 1.4.2 (지금 아카이브의 문서)에서 8로 변경 되었으며 웹에서 찾은 대부분의 스 니펫은 1.4.2 동작을 사용합니다.

예를 들면 다음과 같습니다.

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 1.4.2에서 요소 1, 2, 3을 포함하는 목록을 반환합니다.
  • 1.5.0+에서 배열 스팸이 포함 된 목록을 반환합니다.

많은 경우 감지하기 쉬워야하지만 때로는 눈에 띄지 않게 미끄러질 수 있습니다.

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

20
나는 당신의 예가 깨 졌다고 생각합니다 : Arrays.asList(new int[] { 1, 2, 3 }); 가 있기 때문에 확실히, 자바 1.4.2에서 컴파일되지 않은 int[]것입니다 하지Object[] .
Joachim Sauer

1
아, 맞을지도 몰라 게시하기 전에 예제를 테스트 할 Java 1.4.2 컴파일러가 없었습니다. 이제 여러분의 의견과 Joe의 답변 후에 모든 것이 훨씬 더 합리적입니다.
Alexandru

1
Autoboxing이 프리미티브에서 래퍼 Integer 클래스로의 변환을 다루었을 것이라고 생각했습니다. 먼저 캐스트를 한 다음 위의 코드 Arrays.asList가 작동해야합니다.
Horse Voice

2
Java 8의 Stream.boxed ()는 오토 박싱을 처리하고이를 위해 사용될 수 있습니다. 내 대답을 참조하십시오 아래를 .
Ibrahim Arief

답변:


1430

귀하의 예에서는 기본 유형의 목록을 가질 수 없기 때문입니다. 즉, List<int>불가능합니다.

그러나 기본 요소 를 랩핑하는 클래스를 List<Integer>사용할 수 있습니다 . A에 대한 배열을 변환 와 유틸리티 메소드.IntegerintListArrays.asList

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

코드는 IdeOne.com에서 실시간으로 실행 됩니다.


112
또는 더 간단합니다 : Arrays.asList (1, 2, 3);
Kong

45
를 만들지 않는 방법을 어떻게 알 수 List<Integer[]>있습니까?
Thomas Ahle

25
Java 5 이상에서 실패합니다.
djechlin

6
@ThomasAhle List <Integer []>를 만들지 않고 List <Integer> 개체를 만듭니다. 그리고 타입을 안전하게하려면 다음과 같이 작성하십시오. Arrays. <Integer> asList (spam);
user1712376

6
@ThomasAhle 좋은 질문입니다. 자바 컴파일러의 규칙 일뿐입니다. 예를 들어 다음 코드는 List <Integer []>Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
Simon

167

Java 8에서는 스트림을 사용할 수 있습니다.

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

이것은 좋지만 작동하지 않습니다 boolean[]. 나는 그것이 만들기가 쉽기 때문이라고 생각합니다 Boolean[]. 아마도 더 나은 해결책 일 것입니다. 어쨌든, 그것은 재미있는 기발한 일입니다.
GlenPeterson

138

전환 방법에 대해 말하면 왜 귀하에게 필요한지에 따라 다릅니다 List. 필요한 경우 데이터를 읽기만하면됩니다. 네, 여기 있습니다 :

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

그러나 다음과 같이하면

list.add(1);

당신은 얻을 java.lang.UnsupportedOperationException. 따라서 어떤 경우에는 다음이 필요합니다.

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

첫 번째 방법은 실제로 배열을 변환하지 않지만 배열을 '처럼'나타냅니다 List. 그러나 배열은 고정 된 수의 요소와 같은 모든 속성을 가지고 있습니다. 구성 할 때 유형을 지정해야합니다 ArrayList.


1
"불변성 (immutability)"은 잠시 혼란 스러웠다. 분명히 배열의 값을 변경할 수 있습니다. 그러나 크기는 변경할 수 없습니다.
Tim Pohlmann

125

문제는 varargs가 Java5에 도입되어 불행히도 Arrays.asList()vararg 버전으로 과부하 되었다는 것 입니다. 그래서Arrays.asList(spam) Java5 컴파일러는 int 배열의 vararg 매개 변수로 이해합니다.

이 문제는 Effective Java 2nd Ed., 7 장, 항목 42에 자세히 설명되어 있습니다.


4
무슨 일이 있었는지 이해하지만 문서화되지 않은 이유는 이해하지 못합니다. 휠을 다시 구현하지 않고 대체 솔루션을 찾고 있습니다.
Alexandru

2
@UsmanIsmail Java 8부터이 변환에 스트림을 사용할 수 있습니다. 내 대답을 참조하십시오 아래를 .
이브라힘 아리프

109

조금 늦게 보이지만 여기에 2 센트가 있습니다. 우리는 할 수 없습니다 List<int>와 같은 int우리 만 할 수 있도록 기본 유형이List<Integer> .

자바 8 (int array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 이하 (정수 배열)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

목록이 아닌 ArrayList가 필요하십니까?

ListArrayList를 들어 특정 구현을 원할 경우 다음 toCollection과 같이 사용할 수 있습니다 .

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

list21구조적으로 수정할 수 없습니까?

Arrays.asList반환 된리스트의 크기는 고정 된 것이 아니라 java.util.ArrayList내부에 정의 된 전용 정적 클래스 이기 때문에 고정 된 크기를 사용할 때 고정 됩니다 java.util.Arrays. 따라서 반환 된 목록에서 요소를 추가하거나 제거 UnsupportedOperationException하면가 발생합니다. 따라서 list22목록을 수정하고 싶을 때 함께 가야 합니다. 우리가 Java8을 가지고 있다면 우리는 또한 갈 수 있습니다 list23.

명확하게하기 위해 list21호출 할 수 있다는 의미에서 수정 될 수 list21.set(index,element)있지만이 목록은 구조적으로 수정되지 않을 수 있습니다. 즉, 목록에서 요소를 추가하거나 제거 할 수 없습니다. 이 질문을 확인할 수도 있습니다 .


불변 목록을 원하면 다음과 같이 랩핑 할 수 있습니다.

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

주목해야 할 또 다른 요점은 Collections.unmodifiableList 가 지정된 목록의 수정 불가능한보기를 리턴한다는 것입니다. 수정할 수없는보기 모음은 수정할 수없는 모음이며 배경 모음에 대한보기이기도합니다. 백업 컬렉션에 대한 변경은 여전히 ​​가능할 수 있으며, 변경이 발생하면 수정할 수없는보기를 통해 볼 수 있습니다.

우리는 Java 9와 10에서 불변의 목록을 가질 수 있습니다.

진정한 불변 목록

자바 9 :

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

두 가지 방법으로 Java 10 (Truly Immutable list) :

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

또한이 답변 을 확인하십시오 .


@BasilBourque 추가 / 삭제로 목록 구조를 수정할 수는 없지만 요소를 변경할 수 있습니다.
akhil_mittal

실제로, 나는 몇 가지 코드를 시도하고에 의해 반환 된 목록으로 List::add& 호출 List::remove이 실패 함을 확인했습니다 Arrays.asList. 해당 메소드의 JavaDoc은이 시점에서 제대로 작성되지 않았으며 명확하지 않습니다. 세 번째 읽을 때“fixed-size”라는 구절은 요소를 추가하거나 제거 할 수 없다는 것을 의미한다고 가정합니다.
Basil Bourque


11

최근에 배열을 List로 변환해야했습니다. 나중에 프로그램에서 데이터 제거를 시도하는 목록을 필터링했습니다. Arrays.asList (array) 함수를 사용하면 고정 크기 컬렉션을 만듭니다. 추가하거나 삭제할 수 없습니다. 이 항목은 내가 할 수있는 것보다 문제를 더 잘 설명합니다 . List에서 요소를 제거하려고 할 때 왜 UnsupportedOperationException이 발생합니까?.

결국, 나는 "수동"변환을해야했다 :

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

List.addAll (items) 작업을 사용하여 배열에서 목록으로 변환을 추가 할 수 있다고 가정합니다.


11
new ArrayList<ListItem>(Arrays.asList(itemsArray))같은 것
Marco13

1
@ BradyZhu : 위의 대답은 고정 크기 배열의 문제를 해결하지 못하지만 기본적으로 RTFM을 말하는 것입니다. 항상 나쁜 형식입니다. 답변에 어떤 문제가 있는지 설명하거나 의견을 말하지 마십시오.
Steve Gelman 2019

2
검사 도구에 여기에 경고가 표시 될 수 있으며 그 이유를 설명했습니다. 요소를 수동으로 복사 할 필요가 없으며 Collections.addAll(items, itemsArray)대신 사용하십시오.
Darek Kay

이 예외를 명중하십시오. Marco13의 답변이 정답이 될 것 같습니다. 모든 "asList"예외를 수정하기 위해 일년 내내 코드를 사용해야 할 수도 있습니다.

7

배열 사용

이것은 배열을로 변환하는 가장 간단한 방법 List입니다. 그러나 새 요소를 추가하거나 목록에서 기존 요소를 제거하려고 UnsupportedOperationException하면가 발생합니다.

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

ArrayList 또는 기타 목록 구현 사용

for루프를 사용 하여 배열의 모든 요소를 List구현 에 추가 할 수 있습니다 ( 예 ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

Java 8에서 스트림 API 사용

배열을 스트림으로 전환 한 다음 다른 수집기를 사용하여 스트림을 수집 ArrayList할 수 있습니다. Java 8의 기본 수집기 는 화면 뒤에서 사용 하지만 원하는 구현을 적용 할 수도 있습니다.

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

또한보십시오:


6

apache commons-lang을 사용하는 경우 다른 해결 방법 :

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

어디 ArrayUtils.toObject이 변환 int[]Integer[]


5

배열로 캐스팅해야합니다

Arrays.asList((Object[]) array)

3
java : 호환되지 않는 유형 : int []를 java.lang.Object []로 변환 할 수 없음
dVaffection

@dVaffection 그런 다음 int []로 캐스트합니다. 중요한 부분은 배열로 캐스트하는 것입니다.
Nebril

5

짧막 한 농담:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});

5

Java 9에서는 새로운 편리한 팩토리 메소드를 통해 불변 목록을 사용하는 훨씬 더 우아한 솔루션이 있습니다 List.of.

List<String> immutableList = List.of("one","two","three");

( 여기 에서 뻔뻔스럽게 복사 )


참고로, 이것 뒤에 숨겨진 기술적 세부 사항을 배우려면 JEP 269 : 편의를위한 편의 공장 방법 및 주요 저자 인 Stuart Marks의 이야기를 참조하십시오 .
Basil Bourque

5

Java 8 이상을 대상으로하는 경우 다음을 시도해보십시오.

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

노트:

에주의하십시오 Collectors.<Integer>toList() ,이 일반적인 방법은 오류 "에서 변환 할 수 없습니다 형식 불일치를 방지하는 데 도움 List<Object>List<Integer>".


4
  1. 구아바 사용하기 :

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  2. Apache Commons 컬렉션 사용 :

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);

3

이것이 도움이된다면 : 나는 같은 문제가 있었고 단순히 배열을 가져 와서 같은 내용의 동일한 유형의 ArrayList를 반환하는 일반 함수를 작성했습니다.

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

도움이되지 않으면 어떻게합니까? 그럼 어떻게 했어 ?? ... jk :)
Sᴀᴍ Onᴇᴌᴀ

2

주어진 배열 :

    int[] givenArray = {2,2,3,3,4,5};

정수 배열을 정수 목록으로 변환

한 가지 방법 : boxed ()-> IntStream을 반환

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

두 번째 방법 : 스트림의 각 요소를 정수에 매핑 한 다음 수집

참고 : mapToObj를 사용하면 i를 (char) i로 묶어 각 int 요소를 문자열 스트림, char 스트림 등으로 숨길 수 있습니다

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

한 배열 유형을 다른 유형으로 변환 예 :

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

1

따라서 시도중인 Java 버전에 따라 다릅니다.

자바 7

 Arrays.asList(1, 2, 3);

또는

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

또는

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

자바 8에서

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

참조-http : //www.codingeek.com/java/how-to-convert-array-to-list-in-java/


1

이것이 내가 사용하지만 100 % 명확하지 않기 때문에이 답변을 향상시킬 수 있습니까? 잘 작동하지만 intelliJ는 새로운 WeatherStation을 추가했습니다 [0]. 왜 0입니까?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


왜해야 우리는 개선 당신의 질문을? 당신은 답을 알고 있거나, 그렇지 않습니다. 물론 도움을주는 것보다 더 혼란스러운 답변이 아닌 다른 사람을 실제로 돕는 답변을 제공해야합니다.
HimBromBeere

-2

정수 값으로 사용하는 경우 배열을 목록으로 변환하려면 두 줄의 코드를 사용하십시오. 기본 데이터 유형에는 자동 상자 유형을 사용해야합니다

  Integer [] arr={1,2};
  Arrays.asList(arr);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.