Java subList() 메소드의 문제점

u·2022년 5월 23일

Java

목록 보기
11/11

문제 발견

데이터베이스 과제로 BplusTree를 구현하는 과정에서 list를 스플릿하는데 subList를 사용했다.
이때 한 subList에 값을 추가하면 다른 subList에서 계속 ConcurrentModificationException이 떴다

문제점

Java에서 리스트의 일부를 잘라오는 메소드에 subList 메소드가 있다.
SubList 클래스에서는 내부적으로 root, parent 리스트를 운용하고 있다.

그래서 파이썬처럼 리스트를 잘라와 수정하면 기존 리스트에 변경사항이 적용이 안되는 것이 아니라, parent list에 영향을 끼치게 된다.

이때 트리노드 형식으로 리스트를 자르게 됐을 때, 하나의 리스트 노드를 수정하게 되면 아래와 같은 오류가 생길 수 있다.

위와 같은 문제를 제외하고도 하나의 list를 통해 여러 subList를 만들게 된다면 똑같은 list가 여러 노드리스트에 저장되므로 메모리 낭비를 초래한다.

문제점 해결하기

이러한 subList의 복잡성을 해결하기 위해서 단순히 subList를 List 생성자로 한번 감싸주면 된다.

List<Integer> list = new ArraryList<>(parentList.subList(from, to));

0개의 댓글