Arrays.asList와 new ArrayList<>(Arrays.asList) 의 차이
읽기용, 일반적으로 알고 있는 ArrayList
- Goal
Arrays.asList
와new ArrayList<>(Arrays.asList)
의 차이를 알아본다.
asList로 만든 인스턴스
add가 가능할까?
1 |
|
- 다음과 같은 코드가 있다고 해보자.
- 해당 파일은 정상적으로 컴파일이 될것 처럼 보인다.
- 에러가 표시되지도 않고, 심지어 우리의 똑똑한 인텔리제이는 add가 가능하다고도 알려주고 있다.
- 하지만, 컴파일을 하면 다음과 같이 에러가 발생한다.
- 에러메시지만 봐서는 도대체 왜 에러가 발생한지를 모르겠다.
asList를 통해 반환된것은 읽기만 가능하다.
값의 복사도 이루어지지 않고, 고정된 길이의 List가 리턴된다.
- 오라클 공식 문서에보면 다음과 같이 써있다. (이미지를 클릭하면 커집니다)
Changes to the returned list "write through" to the array.
- 고정된 길이로 리턴하고, 읽기만 가능하다고 써있다.
- 반환형도
java.util.ArrayList
가 아닌,java.util.Arrays.ArrayList
이다.
1 |
|
- 다음과 같이 읽기만 하는 행위에 대해서는 정상적으로 수행한다.
1 |
|
1 |
|
- 하지만 다음과 같은 작업은 가능하다.
- asList 구현 을 보면, 배열의 형태로 돌려주는것을 볼 수 있다.
- 쉽게 생각하면
Array.asList
로 만들어진것은 하나의 고정된 길이의 배열이라고 생각하면 된다. - 이렇게 때문에 길이를 변경시키는 add remove와 같은 작업은 불가능하나, 이미 만들어진 범위내에서는 수정이 가능하다.
- 즉 List처럼 보이나, List인것처럼 보이게 배열을 포장한 형태라고 이해하면 된다.
new ArrayList<>(Arrays.asList())
모든 ArrayList의 모든 api를 사용 할 수 있다.
1 |
|
- add, remove등 모든 기능을 수행할 수 있다.
Reference
- https://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/
- https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList-T…-
- https://stackoverflow.com/questions/25729553/arraylist-vs-the-list-returned-by-arrays-aslist
- https://stackoverflow.com/questions/25447502/regarding-immutable-list-created-by-arrays-aslist