Arrays.asList() vs ArrayList()

Moon·2024년 3월 13일

Java

목록 보기
28/45

https://tecoble.techcourse.co.kr/post/2020-05-18-ArrayList-vs-Arrays.asList/

https://blog.naver.com/roropoly1/221140156345

https://gaeggu.tistory.com/24

  1. 원소를 추가/삭제 할 수 있나?
    결론부터 말하면 new ArrayList<>()는 할 수 있고, Arrays.asList() 할 수 없다.

이때, 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());

toString

https://hianna.tistory.com/551

0개의 댓글