다른 컬렉션 생성자를 보면 질문이 떠 오릅니다. ArrayList ()가 초기 용량이 10 인 빈 목록을 구성하고 ArrayDeque ()가 16 개의 요소를 보유하기에 충분한 초기 용량을 가진 빈 배열 deque를 구성하는 이유는 무엇입니까?
다른 컬렉션 생성자를 보면 질문이 떠 오릅니다. ArrayList ()가 초기 용량이 10 인 빈 목록을 구성하고 ArrayDeque ()가 16 개의 요소를 보유하기에 충분한 초기 용량을 가진 빈 배열 deque를 구성하는 이유는 무엇입니까?
답변:
ArrayDeque 용량은 2의 거듭 제곱이어야하고 16은 10의 최소 제곱입니다.
ArrayDeque는 원형 인 척하는 선형 배열을 감싸기 위해 어디에서나 많은 % 연산을 사용해야합니다.
a % b
a & (b - 1)
마치 b
2의 거듭 제곱 인 것처럼 표현 될 수 있습니다 . 비트 AND는 매우 빠르므로 ArrayDeque의 용량은 2의 제곱으로 제한됩니다. 모든 % 작업은 구현에서 실제 % 대신 비트 마스킹으로 수행됩니다.
이것이 새로운 HashMap이 소수 테이블 크기를 사용하지 않고 2 의 거듭 제곱을 사용하는 이유 이기도 합니다. 왜냐하면 % 연산은 자주 그리고 비트 단위로 수행되어야하고 훨씬 빠르기 때문입니다.
따라서 기준선이 10 인 경우 두 제한의 거듭 제곱을 갖는 구조는 16을 사용해야합니다. 최소 10의 거듭 제곱은 2입니다.
@Esailija의 대답은이 특별한 경우에 좋습니다.
더 일반적으로, 그것은 많은 요인들에 의존하는 트레이드 오프입니다. 몇 가지 예를 들겠습니다.
이러한 절충의 결과로 다른 콜렉션 구현이 다른 최적의 기본 용량을 가질 수 있음을 이해할 수 있습니다.