programing

List.of와 Arrays.asList의 차이점은 무엇입니까?

javaba 2022. 8. 14. 16:50
반응형

List.of와 Arrays.asList의 차이점은 무엇입니까?

Java 9는 목록에 대해 새로운 공장 출하 방식을 도입했습니다.

List<String> strings = List.of("first", "second");

이전 옵션과 새로운 옵션의 차이점은 무엇입니까?즉, 이 두 가지 차이점은 무엇입니까?

Arrays.asList(1, 2, 3);

또, 이하와 같이 됩니다.

List.of(1, 2, 3);

Arrays.asList에 의해 가 변경 됩니다.List.of불변:

List<Integer> list = Arrays.asList(1, 2, null);
list.set(1, 10); // OK

List<Integer> list = List.of(1, 2, 3);
list.set(1, 10); // Fails with UnsupportedOperationException

Arrays.asList할 수 있지만 null 요소는 사용할 수 없습니다.List.of★★★★★★★★★★★★★★★★★★:

List<Integer> list = Arrays.asList(1, 2, null); // OK
List<Integer> list = List.of(1, 2, null); // Fails with NullPointerException

contains을 사용하면 동작이 달라집니다

List<Integer> list = Arrays.asList(1, 2, 3);
list.contains(null); // Returns false

List<Integer> list = List.of(1, 2, 3);
list.contains(null); // Fails with NullPointerException

Arrays.asList전달된 배열의 보기를 반환하므로 배열에 대한 변경 내용이 목록에도 반영됩니다.★★★의 List.of이는 사실이 아닙니다.

Integer[] array = {1,2,3};
List<Integer> list = Arrays.asList(array);
array[1] = 10;
System.out.println(list); // Prints [1, 10, 3]

Integer[] array = {1,2,3};
List<Integer> list = List.of(array);
array[1] = 10;
System.out.println(list); // Prints [1, 2, 3]

와의 차이점

JavaDocs 및 Stuart Marks(또는 이전 버전)의 토크를 참조하십시오.

코드 예시는 다음과 같습니다.

List<Integer> listOf = List.of(...);
List<Integer> asList = Arrays.asList(...);
List<Integer> unmodif = Collections.unmodifiableList(asList);

구조적 불변성(또는 변경 불가)

구조 변경 시도List.of 결과, 「」가 .UnsupportedOperationException추가, 설정, 삭제 의 조작이 포함됩니다.그러나 목록에 있는 개체의 내용을 변경할 수 있습니다(개체가 불변하지 않는 경우). 따라서 목록이 "완전 불변"은 아닙니다.

이것은 로 작성된 수정 불가능한 목록의 경우와 같습니다.이 목록만 원래 목록의 보기이므로 원래 목록을 변경하면 변경될 수 있습니다.

Arrays.asList, 제한도 .또한 제한도 없습니다.set.

listOf.set(1, "a");  // UnsupportedOperationException
unmodif.set(1, "a"); // UnsupportedOperationException
asList.set(1, "a");  // modified unmodif! unmodif is not truly unmodifiable

마찬가지로 백업 배열을 변경하면(보유하고 있는 경우) 목록이 변경됩니다.

구조적 불변성은 이 답변의 범위를 벗어난 방어적 코딩, 동시성 및 보안과 관련된 많은 부작용을 수반한다.

적개심 없음

List.of1.5 에서는 Java 1.5를 사용할 수 .null통과 null "이러한 결과"가 합니다.NullPointerException.

★★Arrays.asList.2 Framework으로 1.2(Collections Framework)를 사용할 수 .로부터의 컬렉션입니다.nulls.

listOf.contains(null);  // NullPointerException
unmodif.contains(null); // allowed
asList.contains(null);  // allowed

시리얼화된 폼

★★List.of는 Java 9에서 도입되어 이 방법으로 작성된 리스트에는 독자적인 (바이너리)시리얼라이즈드 형식이 있기 때문에 이전 JDK 버전에서는 역시리얼라이즈 할 수 없습니다(바이너리 호환성 없음).단, 예를 들어 JSON을 사용하여 시리얼화를 해제할 수 있습니다.

신원

Arrays.asList 콜 " " "new ArrayList이치노

List.of내부 구현에 따라 달라집니다.반환된 인스턴스는 참조가 동일할 수 있지만 이는 보장되지 않으므로 신뢰할 수 없습니다.

asList1 == asList2; // false
listOf1 == listOf2; // true or false

리스트가 작성 방법이나 서포트하는 조작에 관계없이, 같은 순서로 같은 요소를 포함하고 있는 경우는, 리스트가 동등하다는 것을 언급할 필요가 있습니다(을 참조해 주세요.

asList.equals(listOf); // true i.f.f. same elements in same order

구현(경고: 자세한 내용은 버전에 따라 변경될 수 있음)

내의 List.of는 2 이하이며 요소는 특수(내부) 클래스의 필드에 저장됩니다.예를 들어, 2개의 요소(부분 소스)가 격납되어 있는 리스트가 있습니다.

static final class List2<E> extends AbstractImmutableList<E> {
    private final E e0;
    private final E e1;

    List2(E e0, E e1) {
        this.e0 = Objects.requireNonNull(e0);
        this.e1 = Objects.requireNonNull(e1);
    }
}

않으면 된다.Arrays.asList.

시간과 공간의 효율

List.of필드 베이스(크기<2)의 실장에서는, 일부의 조작에서는, 퍼포먼스가 약간 빨라집니다.를 들면, 예예 、 예 as as as 、size()는 배열 길이를 할 수 있습니다.또, 「 길이를 취득하지 않고, 「복수」를 반환할 수 있습니다.contains(E e)에는 반복 오버헤드가 필요하지 않습니다.

를 사용하여 수정할 수 합니다.List.of속도도 빨라요.의 의 레퍼런스 엘리먼트에 합니다.

Collections.unmodifiableList(Arrays.asList(...));

그러면 2개의 목록과 기타 오버헤드가 생성됩니다.인 면에서는, 「이것저것」을합니다.UnmodifiableList포장지랑 동전 몇 푼이요.에서의 HashSet을 사용하다


사용방법: 사용방법List.of않는 및 「변화하지 않는 리스트」가 필요한 경우.Arrays.asList(위 그림과 같이) 변경할 수 있는 목록이 필요한 경우

List.of와 Arrays.asList차이점을 정리합니다.

  1. List.of는 데이터 가 적고되지 않은 합니다.Arrays.asList는, 세트의 할 수 .

  2. List.ofwhile whilewhile while while while while while 、 while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while while 、 while while while while while while while while while while while 。Arrays.asList초기화 중에 힙에 더 많은 개체를 생성하기 때문에 오버헤드 공간이 더 많이 사용됩니다.

  3. " " " 에서 반환된 List.of하기 때문에 이며 콜렉션은 에 반환됩니다.Arrays.asList는변환가능하며 스레드 세이프가 아닙니다.(불변의 컬렉션인스턴스는 일반적으로변환 가능한 컬렉션인스턴스보다 메모리 소비량이 훨씬 적습니다).

  4. List.ofnull 요소는 사용할 수 없습니다.Arrays.asList는 늘 요소를 허용합니다.

의 답변과는 로, 어느 쪽의 도, 어느 쪽의 조작이 .List::of ★★★★★★★★★★★★★★★★★」Arrays::asList하다:

+----------------------+---------------+----------+----------------+---------------------+
|      Operations      | SINGLETONLIST | LIST::OF | ARRAYS::ASLIST | JAVA.UTIL.ARRAYLIST |
+----------------------+---------------+----------+----------------+---------------------+
|          add         |       ❌      |     ❌  |        ❌      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|        addAll        |       ❌      |     ❌  |        ❌      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|         clear        |       ❌      |     ❌  |        ❌      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|        remove        |       ❌      |     ❌  |        ❌      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|       removeAll      |       ❗️       |     ❌   |        ❗️       |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|       retainAll      |       ❗️       |     ❌  |        ❗️        |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|      replaceAll      |       ❌      |     ❌  |        ✔️       |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|          set         |       ❌      |     ❌  |        ✔️       |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|         sort         |       ✔️       |     ❌   |        ✔️      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
|  remove on iterator  |       ❌      |     ❌  |        ❌      |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
| set on list-iterator |       ❌      |     ❌  |        ✔️       |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
  1. ✔지원되는 메서드를 의미합니다.
  2. ❌는 이 메서드를 호출하면 UnsupportedOperation이 발생함을 의미합니다.예외.
  3. ❗singletonList("foo")와 같이 메서드의 인수가 변환을 유발하지 않는 경우에만 메서드가 지원됨을 의미합니다. 예를 들어, Collections.singletonList("foo")는 정상이지만 Collections.singletonList("foo").retainAll("bar")는 지원되지 않는 작업을 의미합니다.예외.

컬렉션 상세:: singleton List Vs. 목록::/

Arrays.asList(1, 2, 3);

고정 크기 목록이 생성됩니다.

public static void main(String[] args) {
        List<Integer> asList = Arrays.asList(1, 2, 3, 4, 5);
        asList.add(6);    // java.lang.UnsupportedOperationException
        asList.remove(0); // java.lang.UnsupportedOperationException
        asList.set(0, 0); // allowed
}

목록./(1, 2, 3);

Unmutable(Java 9)/Unmodify(Java 11) 목록이 생성됩니다.

public static void main(String[] args) {
    List<Integer> listOf = List.of(1, 2, 3, 4, 5);
    listOf.add(6);    // java.lang.UnsupportedOperationException
    listOf.remove(0); // java.lang.UnsupportedOperationException
    listOf.set(0, 0); // java.lang.UnsupportedOperationException
}

언급URL : https://stackoverflow.com/questions/46579074/what-is-the-difference-between-list-of-and-arrays-aslist

반응형