일반 배열을 ArrayList로 바꿔야 할 때는 Arrays.asList()를 사용해서 간단하게 바꿀 수 있습니다.
그러나 asList를 사용하면서 신기한 현상을 발견했습니다.
public static void main(String[] args) {
Character[] arr = {'c', 'b', 'e', 'd', 'a'};
List<Character> list = Arrays.asList(arr);
Comparator byAlpa = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return (char)o1 - (char)o2;
}
};
list.sort(byAlpa);
}
배열을 list로 바꾼 후에 정렬을 하는 코드인데,
이 상태로 출력을 하게 되니까
list는 제대로 정렬이 되는데, arr도 같이 정렬이 되는 현상이 발생했습니다.
그 이유는 아래와 같았습니다.
List<Character> list1 = Arrays.asList(arr);
List<Character> list2 = new ArrayList<>();
위 코드에서 list와 list2는 다른 리스트이기 때문입니다.
list2는 새로운 배열 객체를 만드는 것이지만,
list1은 새로 만드는 것이 아닌, 원본 배열의 주소값만을 가지는 것입니다.
따라서 list1은 추가 또는 삭제같이 공간의 갯수에 변경을 주는 작업은 불가능합니다.
(UnsupportedOperationException 예외가 발생합니다.)
또한, 주소값을 공유하기 때문에 값이 바뀌게 되면 원본 배열의 값도 바뀌게 됩니다.
원본 배열의 주소값을 가진 리스트가 아닌,
동적으로 크기가 늘어나는 새로운 배열 객체를 만들고 싶다면 아래 코드처럼 수정해야 합니다.
List<Character> list = new ArrayList<Character>(Arrays.asList(arr));
참고 링크
'Backend > JAVA' 카테고리의 다른 글
JUnit5의 기본적인 사용법들 (3) | 2021.03.11 |
---|---|
DIP(Dependency Inversion Principle) (3) | 2020.06.23 |
Java DateTimeFormatter을 사용하여 요일, 오전/오후 구하기 (+ 다른 나라 언어로 포맷팅 변경하는 방법) (0) | 2020.01.02 |
추상화(Abstract) (0) | 2019.02.27 |
다형성(Polymorphism) (1) | 2019.02.23 |