ListとSetの性能について

この記事で何がしたいか?

前回記事の、「LinkedListのランダムアクセスについて」の記事の派生形として、

その他のリスト型やSetインタフェースの挙動について性能比較してみた。

実施条件

対象は以下のクラスと関数に絞っている。

クラス

  • ArrayList
  • LinkedList
  • CopyOnWriteArrayList
  • HashSet
  • LinkedHashSet
  • TreeSet
  • CopyOnWriteArraySet

メソッド

  • add
  • addAll
  • contains(一致する場合)
  • contains(一致しない場合)
  • get(拡張for文)
  • get(ランダムアクセス)
  • size

処理時間一覧表

コレクション別メソッド表対象クラストメソッド表・処理時間は各件数の総合計時間。

・containsは件数分処理実行しているため、50万件リストについては50万回containsしている
全体的に、スレッドセーフであるCopyOnWriteXXXは時間がかかる傾向にある。
また、Listのcontainsより、Setのcontainsの方がパフォーマンスとしては優れている

結論

以上の処理時間結果と、APIの内容を各クラスの特徴としてまとめてみた。
・当然の事ではあるが、用途毎に選択すべき。
・特に意識したくないケースであれば、重複OKなArrayList又はHashSetの使い分け
・Setはいずれも内部的にMapを保持している為、contains処理が早い傾向にある。
 (map.containsKey(Object o)としているため、Listに比べて走査量が少ない)
・Setは全体的にListに比べて使用メモリが大きい傾向になりそうなので、要素数に気を付ける

シェアする

  • このエントリーをはてなブックマークに追加

フォローする