다음과 같이 초기화 된 배열이 있습니다.
Element[] array = {new Element(1), new Element(2), new Element(3)};
이 배열을 ArrayList
클래스 의 객체로 변환하고 싶습니다 .
ArrayList<Element> arraylist = ???;
답변
new ArrayList<>(Arrays.asList(array));
답변
주어진:
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
가장 간단한 대답은 다음과 같습니다.
List<Element> list = Arrays.asList(array);
이것은 잘 작동합니다. 그러나 몇 가지주의 사항 :
- asList에서 반환 된 목록의 크기 는 고정되어 있습니다 . 따라서 코드의 반환 된 목록에서 요소를 추가하거나 제거하려면 새로 감싸 야합니다
ArrayList
. 그렇지 않으면을 얻습니다UnsupportedOperationException
. - 에서 반환 된 목록
asList()
은 원래 배열에 의해 지원됩니다. 원래 배열을 수정하면 목록도 수정됩니다. 놀랍습니다.
답변
(오래된 실이지만 구아바 또는 다른 라이브러리와 다른 세부 사항을 언급하지 않은 2 센트)
가능하면 구아바를 사용하십시오
구아바 길을 지적하면 가치가 있습니다.
용법
불변 목록
ImmutableList
클래스와 해당 메소드 of()
및 copyOf()
팩토리 메소드를 사용하십시오 (요소는 널 (null) 일 수 없음) .
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
가변 목록
Lists
클래스와 newArrayList()
팩토리 메소드를 사용하십시오 .
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
다른 클래스의 다른 데이터 구조에 대해서도 비슷한 방법을 참고하십시오. Sets
.
왜 구아바?
구아바 공장 방법을 사용함에 따라 유형 안전을위한 제네릭으로 인해 혼란을 줄이는 것이 주요 매력이 될 수 있습니다. 사용하면 대부분 유형을 유추 할 수 . 그러나 Java 7이 새로운 다이아몬드 연산자와 함께 도착한 이후로이 주장은 물을 덜 보유합니다.
그러나 이것이 유일한 이유는 아닙니다 (그리고 Java 7이 아직 어디에도 없습니다) : 속기 구문도 매우 편리하며 위에서 설명한 것처럼 메소드 초기화 프로그램은보다 표현력있는 코드를 작성할 수 있습니다. 하나의 구아바 호출에서 현재 Java 컬렉션으로 2를 차지합니다.
당신이 할 수 없다면 …
불변 목록
JDK의 Arrays
클래스와 asList()
팩토리 메소드를 사용하십시오 Collections.unmodifiableList()
.
List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
에 대한 반환 유형 asList()
은 List
구체적인 ArrayList
구현을 사용하지만 NOT java.util.ArrayList
입니다. 내부 유형으로 에뮬레이션ArrayList
하지만 실제로 전달 된 배열을 직접 참조하고이를 “쓰기”합니다 (수정은 배열에 반영됨).
List
단순히 (확장, AbstractList
요소 추가 또는 제거는 지원되지 않음) 확장을 통해 일부 API 메소드를 통한 수정을 금지 하지만 호출을 통해 set()
요소를 대체 할 수 있습니다. 따라서이 목록은 불변이 아니며에 대한 호출 asList()
은로 묶어야합니다 Collections.unmodifiableList()
.
변경 가능한 목록이 필요한 경우 다음 단계를 참조하십시오.
가변 목록
위와 동일하지만 실제 래핑되어 있습니다 java.util.ArrayList
.
List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
교육 목적 : 좋은 수동 방법
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
답변
이 질문은 꽤 오래되었으므로 아무도 가장 간단한 양식을 제안하지 않았다는 사실에 놀랐습니다.
List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
Java 5 Arrays.asList()
부터는 varargs 매개 변수를 사용하므로 명시 적으로 배열을 구성 할 필요가 없습니다.
답변
new ArrayList<T>(Arrays.asList(myArray));
myArray
이 유형이와 동일한 지 확인하십시오 T
. 예를 들어 List<Integer>
의 배열에서 를 만들려고하면 컴파일러 오류가 발생합니다 int
.
답변
다른 방법으로 ( new ArrayList(Arrays.asList(array))
성능면 에서 솔루션 과 본질적으로 동일하지만)
Collections.addAll(arraylist, array);
답변
자바 9
Java 9 에서는 리터럴 List.of
을 작성하기 위해 정적 팩토리 메소드를 사용할 수 있습니다 List
. 다음과 같은 것 :
List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
이것은 세 개의 요소를 포함 하는 불변 목록을 반환합니다 . 변경 가능한 목록 을 원하면 해당 목록을 ArrayList
생성자 에게 전달하십시오 .
new ArrayList<>(List.of(// elements vararg))
JEP 269 : 컬렉션의 편의 팩토리 메소드
JEP 269 는 Java Collections API를 위한 편리한 팩토리 메소드를 제공합니다 . 이 불변의 static 팩토리 메소드가 내장되어 있습니다 List
, Set
그리고 Map
나중에 자바 (9)과의 인터페이스를 제공합니다.