
Array를 List로 변환하기 위해서 Arrays.asList , List.of 둘다 사용가능하다.
스트림을 공부하면서 여러 코드를 보는데 Arrays.asList , List.of 모두 많이 사용하는 것 같아서 둘이 어떤 차이가 있고, 어떨때 자주 사용하는지를 공부해보려고 한다.
1. Null 허용
| Arrays.asList() | O |
| List.of() | X |
List<Integer> list = Arrays.asList(1, 2, null); // OK
List<Integer> list = List.of(1, 2, null); // X
List.of()를 통해 객체가 반환될 때, 내부적으로 파라미터들에 대한 null체크를 하고 null이 있으면 NullPointerException이 발생한다.
2. 변경 가능
| Arrays.asList() | O |
| List.of() | X |
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); // X
자바의 Arrays 클래스를 들여다보면 Arrays.asList()는 아래와 같이 ArrayList를 리턴합니다. 따라서 set메서드가 사용가능합니다.
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
그러나, List.of()는 불변객체인 ListN을 반환합니다. 그래서 수정이 불가능합니다.
static <E> List<E> of(E e1, E e2, E e3) {
return new ImmutableCollections.ListN<>(e1, e2, e3);
}
여기서 Array.asList()각 반환하는 ArrayList타입은 java.util.ArrayList가 아니라 Array의 내부 클래스이다. 여기에는 add, remove가 구현되어있지 않아 size는 변경될 수 없다.
3. 참조
| Arrays.asList() | O |
| List.of() | X |
Arrays.asList()는 참조를 사용하기 때문에 배열이 변경되면, list에도 영향을 끼칩니다.
List.of()는 값을 기반으로 독립된 객체를 만들기 때문에 참조가 일어나지 않습니다.
Arrays.asList()의 객체로 add, remove를 구현할 수 없는 이유 역시, 참조로 동작하기 때문입니다. (배열의 크기는 늘리고 줄일 수 없으니까)
4. 메모리 사용
Arrays.asList() > List.of()
힙에 더 많은 개체를 생성하기 때문이다.
따라서 값의 요소만 사용하고 싶은 경우에는 List.of()를 사용하는것이 좋다.
List<String> list = List.of("one","another","one_more")
'Java' 카테고리의 다른 글
| [Java] 함수형 인터페이스 (0) | 2022.12.02 |
|---|---|
| [ Java ] Enum (0) | 2022.11.23 |
| [Java] MultiValueMap이란 (0) | 2022.11.17 |
| [Java] 스트림 (0) | 2022.10.31 |
| 토이프로젝트 후 느낀점 (0) | 2022.10.29 |