さまざまなコレクションコンストラクターを見ると、疑問が浮かびます。ArrayList()が初期容量10の空のリストを作成し、ArrayDeque()が16要素を保持するのに十分な初期容量の空の配列dequeを作成するのはなぜですか。
さまざまなコレクションコンストラクターを見ると、疑問が浮かびます。ArrayList()が初期容量10の空のリストを作成し、ArrayDeque()が16要素を保持するのに十分な初期容量の空の配列dequeを作成するのはなぜですか。
回答:
ArrayDequeの容量は2の累乗でなければならず、16は2の最小の累乗であり、少なくとも10です。
ArrayDequeは、多くの%演算をどこでも使用して、円形のふりをする線形配列をラップする必要があります。
a % b
2の累乗であるa & (b - 1)
かの ように表現できますb
。ビット単位のANDは非常に高速であるため、ArrayDequeの容量は2のべき乗に制限されています。実装では、すべての操作が実際のビットマスクではなくビットマスクで実行されます。
これはまた、新しいHashMapが素数テーブルサイズではなく2の累乗を使用しない理由でもあります。これも、%演算を頻繁にビット単位で実行する必要があり、はるかに高速であるためです。
したがって、ベースラインが10の場合、2のべき乗の制限がある構造体は、最小の2のべき乗である少なくとも10であるため、16を使用する必要があります。
@Esailijaの答えは、この特定のケースに適しています。
ただし、より一般的には、多くの要因に依存するトレードオフです。いくつか例を挙げます。
これらのトレードオフの結果、コレクションの実装ごとに最適なデフォルト容量が異なる可能性があることは十分に理解できます。