어레이에서 ArrayList를 만듭니다


질문

 

나는 배열이 초기화 된 것처럼 보입니다.

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. The list returned from asList has fixed size. So, if you want to be able to add or remove elements from the returned list in your code, you'll need to wrap it in a new ArrayList. Otherwise you'll get an UnsupportedOperationException.
  2. The list returned from asList() is backed by the original array. If you modify the original array, the list will be modified as well. This may be surprising.


답변

(오래된 실, 그러나 구아바 또는 다른 libs와 다른 세부 사항은 언급하지만 2 센트

당신이 할 수 있다면 구아바를 사용하십시오

구아바 (Guava) 방법을 지적 할 가치가 있으며, 이는이 Shenanigans를 크게 단순화합니다.

용법

불변의 목록을 위해

immutableList 클래스와 () 및 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

예를 들어, 다른 클래스의 다른 데이터 구조에 대한 유사한 방법은 세트에서 유사한 방법을 기록 해주십시오.

왜 구아바?

주요 인력은 Guava 공장 방식의 사용을 허용 할 수 있으므로 유형 안전을위한 제네릭으로 인한 클러터를 줄일 수 있습니다.그러나이 논쟁은 Java 7이 새로운 다이아몬드 운영자에게 도착했기 때문에 물이 적을 수 있습니다.

그러나 그것은 유일한 이유가 아닙니다 (그리고 Java 7은 아직 도처가 아닙니다.) : ShortHand 구문도 매우 편리하며, 위에서 볼 수 있듯이 메소드 초기화 프로그램은 더 표현력있는 코드를 작성할 수 있습니다.하나의 Guava에서 현재 Java 컬렉션으로 2를 소요되는 것을 호출합니다.


네가 할 수 없다면 ...

불변의 목록을 위해

collections.unmodifiableList ()를 묶은 JDK의 배열 클래스 및 해당 Aslist () 팩토리 메소드를 사용하십시오.

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

aslist ()에 대한 반환 된 유형은 구체적인 ArrayList 구현을 사용하는 목록이지만 java.util.ArrayList가 아닙니다.이는 ArrayList를 에뮬레이트하지만 실제로 통과 된 배열을 직접 참조하는 이인 유형이며 "쓰기"(수정 사항이 배열에 반영됨)를 만듭니다.

추상 목록을 확장하는 방법으로 목록 API의 일부를 통해 수정을 금지합니다 (그래서 요소 추가 또는 제거는 지원되지 않음)을 허용합니다.따라서이 목록은 정말 불변이 아니며 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+

교육 목적으로 : 좋은 OL '수동 방법

// 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와 동일한 유형인지 확인하십시오. 예를 들어, int 배열에서 목록 <정수>를 만들려고하면 컴파일러 오류가 발생합니다.



답변

또 다른 방법 (본질적으로 새로운 ArrayList (arrays.aslist (배열) 솔루션 성능이 현명하다)

Collections.addAll(arraylist, array);
출처:https://stackoverflow.com/questions/157944/create-arraylist-from-array