순간을 기록으로

[Java] Arrays.asList와 List.of 차이점 본문

Development/JAVA

[Java] Arrays.asList와 List.of 차이점

luminous13 2022. 6. 28. 17:34

개요

안녕하세요. 루미너스입니다.

공부하다가 Arrays.asList와 List.of 기능은 같은데 뭐가 다른지 궁금해서 찾아봤습니다.

결론부터 말하자면 Arays.asList는 조금 더 자유롭고 List.of는 사용하기에 더 엄격하다고 생각하시면 좋습니다.

 

공통점

Array.asList와 List.of 모두 고정된 크기의 리스트를 반환합니다. 그렇기 때문에 새 요소를 추가하거나 삭제하면 UnsupportedOperationException이 발생합니다. 

 

차이점1: List.of는 set으로 값을 변경할 수 없다.

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의 mutable list를 반환하지만 List.of의 경우 immutable list를 반환하므로  값을 수정할 수 없습니다.

만약 값을 수정한다면 UnsupportedOperationException이 발생합니다.

 

차이점2: List.of는 null 요소를 가질 수 없다.

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

Arrays.asList의 경우 값이 null 요소를 허용하지만, List.of의 경우 null인 요소를 허용하지 않습니다.

 

차이점3: List.of는 contains(null)에 예외를 던진다.

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의 경우 null이 있으면 true, 없으면 false를 리턴하지만 List.of는 null이 애초에 못들어가므로 예외가 발생합니다.

 

차이점4: 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]

Arrays.asList의 경우 원본 배열이 변할경우 값도 변합니다. 반면에 List.of의 경우 원본 배열이 값이 바뀌어도 값이 변하지 않습니다.

 

추가 

고정된 크기의 리스트가 아닌 요소를 추가하거나 삭제할 수 있는 리스트가 필요한 경우가 있습니다.

이때에는 new ArrayList<>(Arrays.asList/ List.of)와 같이 사용하면 됩니다.

 

참고

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

Comments