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에 대한 배열을 변환 와 유틸리티 메소드.Integer
int
List
Arrays.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가 필요하십니까?
List
예 ArrayList
를 들어 특정 구현을 원할 경우 다음 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) :
List.copyOf(Arrays.asList(integers))
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) 작업을 사용하여 배열에서 목록으로 변환을 추가 할 수 있다고 가정합니다.