모눈종이에 사각사각

[Java] List.of(), Arrays.asList() 본문

Java

[Java] List.of(), Arrays.asList()

모눈종이씨 2022. 10. 28. 11:59

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/

 

+ 참고하면 좋을 것 같은 사이트

https://donnaknew.tistory.com/22

'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
Comments