Java

[Java] Arrays.asList 와 List.of

인생은단짠단짠 2022. 11. 17. 21:39

 

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