대표적인 mutable 리스트인 ‘ArrayList’와 ‘LinkedList’에 대해 흔히 아는 사실은 다음과 같다.
ArrayList
LinkedList
정확히 반대의 분야에서 서로 Top인 상황..
최근 알고리즘 문제를 풀다, 빈번한 원소 삽입/삭제가 있는 문제에서 ‘LinkedList’는 시간초과가, ‘ArrayList’는 통과가 되는 신기한 경험을 했다.
통념이 사실인지 직접 실험해보면서 어떤 성능적 차이가 있는 지 확인해 보자
먼저 내부 구현을 통해 동작 방식을 알아보자
override actual fun get(index: Int): E {
checkElementIndex(index)
return backingArray[offset + index]
}
⇒ index를 통해 RandomAccess가 가능한 것을 확인할 수 있다.
fun add(index: Int, element: E) 내부 구현에서 실제 값이 저장되는 부분을 찾아가면 아래의 코드를 확인할 수 있다.
private fun addAtInternal(i: Int, element: E) {
if (backingList != null) {
backingList.addAtInternal(i, element)
backingArray = backingList.backingArray
length++
} else {
insertAtInternal(i, 1)
backingArray[i] = element
}
}
private fun insertAtInternal(i: Int, n: Int) {
ensureExtraCapacity(n)
backingArray.copyInto(backingArray, startIndex = i, endIndex = offset + length, destinationOffset = i + n)
length += n
}