Arrays.asList(), List.of()
자바는 Array를 List로 변환하기 위해 Arrays.asList( array )
를 사용한다.
Java 9 부터는 List.of( array )
라는 새로운 팩토리 메서드가 도입됐다.
차이점에 대해 알라bo자~
변경 가능 여부
Arrays.asList()
로 반환된 List는 변경이 가능하다. (Mutable)
ArrayList
를 반환하기 때문에 set이 구현돼있다.
(java.util.ArrayList
가 아닌Arrays
의 내부 클래스로, add와 remove는 없기 때문에, 크기는 변하지 않는다.)
하지만 List.of()
로 반환된 메서드는 변경이 불가능하다. (Immutable)
ListN
이라는 타입을 반환하고, 이는 불변 객체이다.
List<Integer> list1 = Arrays.asList(1, 2, null);
list1.set(1, 10); // OK
List<Integer> list2 = List.of(1, 2, 3);
list2.set(1, 10); // Fails with UnsupportedOperationException
Null 허용 여부
Array.asList()
는 null을 허용한다.
List.of()
는 반환 객체가 생성될 때, 내부적으로 모두 null 체크를 하며, null을 허용하지 않는다.
List<Integer> list1 = Arrays.asList(1, 2, null); // OK
List<Integer> list2 = List.of(1, 2, null) // NPE
추가로, List.of()
로 생성한 list에 contains(null)
을 해도 NPE가 발생한다.
참조 / 비참조
Arrays.asList( array )
가 add와 remove를 구현할 수 없는 이유는 참조로 동작하기 때문이다.
- 배열은 크기를 변경할 수 없기 때문.
따라서 원본 array의 값이 변경되면 list에도 변경된다.
Integer[] array = {1, 2};
List<Integer> list = Arrays.asList(array);
array[0] =100;
System.out.println(list); // [100, 2]
반면 List.of(array)
의 결과는 값을 기반으로 독립적인 객체를 만들기 때문에 비참조이다.
(예시는 뻔하니까 생략)
메모리 사용
일반적으로 변경 불가능한 컬렉션 인스턴스는 변경 가능한 컬렉션 인스턴스보다 훨씬 적은 메모리를 사용한다.
변경 불가능한 컬렉션은 JVM 내에서 캐싱될 수 있기 때문이다.
따라서 반 불면인 Arrays.asList()
보단 완전 불변인 List.of()
가 더 권장되는 편이다.
요약
- Java 8까지는
Arrays.asList()
만, Java 9부터는List.of()
도 가능! Arrays.asList()
는 Mutable,List.of()
는 ImmutableList.of()
는 null 허용 XArrays.asList()
는 원본 배열 참조!- 메모리 측면에서 불변 객체인
List.of()
가 더 권장됨
출처
'코딩 > Java' 카테고리의 다른 글
Java - Date, LocalDate, LocalDateTime 의 차이점 및 활용법 (+ZonedDateTime) (0) | 2025.02.25 |
---|---|
Java - Predicate (0) | 2023.08.23 |
객체지향 개발 5대 원리 - SOLID 원칙 (0) | 2023.07.07 |
Java - Long과 AtomicLong의 차이, AtomicLong에 대해 (0) | 2023.06.21 |
Java - 동시성 환경에서의 블로킹 vs 논 블로킹 (2/2) (0) | 2023.06.21 |