모눈종이에 사각사각
[Java] List.of(), Arrays.asList() 본문
List.of()
코딩을 하던 중, List에 add()를 했더니 UnsupportedOperationException 예외가 발생했다.
List에 add를 왜 못하지..? 라는 생각에 작업하던 List의 타입을 확인해봤다.
java.util.ImmutableCollections$ListN
ImmutableCollections라니!
원인은 내가 리스트를 생성할 때 다음과 같이 List.of()를 사용했기 때문이었다.
List<Integer> list1 = List.of(1, 2, 3, 4);
List.of() 메서드는 Java9 부터 지원하는 메서드이며 Immutable한 Collection이다.
따라서 add(), remove(), set(), replace() 등의 작업을 할 수 없다. (UnsupportedOperationException 발생!)
또한, null 값이 허용되지 않는다.
null 값을 넣으려고 할 경우 NullPointerException이 발생한다.
List list3 = List.of("홍길동", "김철수", "김영희", null); // NullPointerException
Arrays.asList(Object... a)
위에서 설명했듯이 List.of()는 불변 컬렉션이다.
이와 비슷하게 Arrays.asList()는 배열을 List에 담아서 반환하는데, asLIst()가 반환한 List는 크기를 변경할 수 없다.
따라서 추가, 삭제가 불가능하고, 변경은 가능하다.
Arrays.asList()는 다음과 같이 사용할 수 있다.
List list1 = Arrays.asList(new Integer[]{1,2,3,4,5});
List list2 = Arrays.asList(1,2,3,4,5); // 매개 변수 타입이 가변인수라서 저장할 요소만 나열하는 것도 가능하다.
System.out.println("list1 = " + list1);
System.out.println("list2 = " + list2);
/**
* list1 = [1, 2, 3, 4, 5]
* list2 = [1, 2, 3, 4, 5]
*/
이렇게 asList()가 반환한 리스트에 add()를 하려고 하면 UnsupportedOperationException 예외가 발생한다.
// list1.add(100); UnsupportedOperationException 예외 발생!
따라서 크기를 변경할 수 있는 List가 필요하다면 다음과 같이 ArraysList로 변환하여 add()해주면 된다.
List list3 = new ArrayList(Arrays.asList(1,2,3,4,5));
list3.add(100);
System.out.println("list3 = " + list3);
/**
* list3 = [1, 2, 3, 4, 5, 100]
*/
그리고 Arrays.asList()는 List.of()와 달리 null 값이 허용된다.
List list4 = Arrays.asList("홍길동", "김철수", "김영희", null);
System.out.println("list4 = " + list4);
/**
* list4 = [홍길동, 김철수, 김영희, null]
*/
정리
List.of()는 추가, 삭제, 변경 모두 불가능! +(null 허용하지 않음)
Arrays.asList()는 추가, 삭제가 불가능하고 변경은 가능! (null 허용)
참고사이트
https://kim-jong-hyun.tistory.com/31
https://www.daleseo.com/java9-immutable-collections/
+ 참고하면 좋을 것 같은 사이트
'Java' 카테고리의 다른 글
[Java] @Override Annotation (0) | 2022.10.29 |
---|---|
[Java] List 중복 제거하기 (0) | 2022.10.28 |
[Java] String클래스와 substring() (0) | 2022.10.28 |
[Java] 오버로딩(Overloading) vs 오버라이딩(Overriding) (0) | 2022.07.05 |
[Java] static import (0) | 2022.06.01 |