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

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



답변

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

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

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

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


답변

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

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


답변

전환 방법에 대해 말하면 왜 귀하에게 필요한지에 따라 다릅니다 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.


답변

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

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


답변

조금 늦게 보이지만 여기에 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());

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


답변

더 짧은 :

List<Integer> list = Arrays.asList(1, 2, 3, 4);


답변

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

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

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

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