배열에서 ArrayList 만들기 {new Element(1),

다음과 같이 초기화 된 배열이 있습니다.

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

이것은 잘 작동합니다. 그러나 몇 가지주의 사항 :

  1. asList에서 반환 된 목록의 크기고정되어 있습니다 . 따라서 코드의 반환 된 목록에서 요소를 추가하거나 제거하려면 새로 감싸 야합니다 ArrayList. 그렇지 않으면을 얻습니다 UnsupportedOperationException.
  2. 에서 반환 된 목록 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 269Java Collections API를 위한 편리한 팩토리 메소드를 제공합니다 . 이 불변의 static 팩토리 메소드가 내장되어 있습니다 List, Set그리고 Map나중에 자바 (9)과의 인터페이스를 제공합니다.