https://tecoble.techcourse.co.kr/post/2020-05-18-ArrayList-vs-Arrays.asList/
https://blog.naver.com/roropoly1/221140156345
이때, asList()를 사용해서 List 객체를 만들 때 새로운 배열 객체를 만드는 것이 아니라, 원본 배열의 주소값을 가져오게 된다.
따라서 asList()를 사용해서 내용을 수정하면 원본 배열도 함께 바뀌게 되고 원본 배열을 수정하면 그 배열로 만들어뒀던 asList()를 이용한 List 내용도 바뀌게 된다.
이러한 이유 때문에 Arrays.asList()로 만든 List에 새로운 원소를 추가하거나 삭제 할 수 없다.
따라서 Arrays.asList()는 배열의 내용을 수정하려고 할 때 List로 바꿔서 편리하게 사용하기 위함.
만약 진짜 ArrayList를 받기 위해서는 다음과 같이 변환하면 된다.
ArrayList 생성자는 java.util.Arrays.ArrayList의 상위(super) 클래스인 Collection Type 도 받아들일 수 있다.
List<String> list = new ArrayList<String>(Arrays.asList(arr));
[1] 배열(Array) -> 리스트(List)
(1) 객체 타입 배열 -> 리스트 (Arrays.asList(), List.of())
객체 타입 배열은 Arrays.asList() 와 List.of() 통해 리스트로 변환 가능하다. (List.of()는 java 9부터 지원)
Integer[] arr1 **= {1, 2, 3};
List list1 = Arrays.asList(arr1);
List list2 = List.of(arr1);
// list1.add(4) // Unsupported OperationException 예외 발생
이때 반환된 리스트는 고정 사이즈 리스트로 추가, 삭제가 불가능하다. 그 이유는 java.util.ArrayList 와 다른 List 구현 클래스를 반환하기 때문이다.
Arrays.asList() → java.util.Arrays.ArrayList
List.of() ->java.util.ImmutableCollections.ListN
만약에 리스트를 변경 가능하게 만들고싶다면 ArrayList 생성자를 한 번 더 감싸주어야 한다.
(Collection 인터페이스를 구현하고 있기 때문에 가능)
List notFixedList = new ArrayList(Arrays.asList(arr1));;
(2) 기본 타입 배열 -> 리스트
리스트는 기본 타입(Primitive type)을 지원하지 않기 때문에 boxed()를 이용해 래퍼 타입(Wrapper type) 으로 박싱한 후에 리스트로 변환해야 한다.
int[] arr = {1, 2, 3};
List list = Arrays.stream(arr)
.boxed() // 기본 타입 -> 래퍼 타입
.collect(Collectors.toList());