よく使うListの実装クラスはやっぱりArrayList。
せっかく使うなら効率的に使いましょうということで押さえておくべきポイントを3つ紹介します。
基本となる考え
ArrayListは可変長な配列を実現するためのクラスです。
内部で配列を使って実装されていますが、通常の配列は固定長です。
では、どのようにして可変長を実現しているかというと、最初に用意した配列が足りなくなったらより大きいサイズの配列を新しく作り、そこにデータをコピーするということをしています。
また、途中にデータを挿入する場合、後続の要素をすべてコピーしてずらすという処理を行っています。
配列のサイズが大きくなってくると、このような配列の再生成やコピーする処理が非常に遅くなるのでArrayListを効率的に使うためにはこのような処理の発生を防ぐことが重要です。
3つのポイント
初期サイズの設定
ArrayListのコンストラクタでは初期サイズを指定することができます。
指定した初期サイズで最初に配列が生成されるため、そのサイズを超えるまでは配列の再生成が発生しなくなります。
例えば、要素の数が多くても100個というときは以下のようにすることで初期容量100でArrayListを生成します。
List<String> list = new ArrayList<String>(100);
ensureCapacity
ensureCapacityはArrayListのサイズを確保するメソッドです。
コンストラクタで指定した初期サイズを大きく超えそうなときに使います。
例えば、初期サイズ100で初期化したArrayListに1000個要素を追加する場合、普通に1000回addすると途中で何度か再生成が発生する可能性がありますが、ensureCapacityであらかじめ1000にサイズを拡張しておけば1回だけですみます。
trimToSize
trimToSizeはArrayListのサイズを現在の要素数で切り詰めるメソッドです。
例えば、初期サイズ1000で初期化したArrayListに100個だけしか要素が入らない場合、900個分の領域が無駄になるので切り詰めることでその領域を解放します。
もちろん、サイズが小さくなるのでそのあとに要素を追加しようとすると配列の再確保が発生します。
そのため、それ以降の処理で要素を追加しないような場合に使うとよいでしょう。