読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:コレクション型

[Java]Javaの学習

内容

  • List
    • Vector: サイズ変更可能な配列。配列なのでデータへのアクセスは速いが、arraycopy()を使うので挿入・削除は遅い。スレッドセーフ
    • ArrayList: Vectorと本質は同じ。スレッドセーフでは無い分、Vectorより速い
    • LinkedList: いわゆる双方向リスト。挿入や削除は速いが、データへのアクセスは遅い。
  • Map/SortedMap
    • Hashtable: オブジェクトのハッシュコードを利用し、データを格納するテーブル(配列の配列)を作成。マップが大きくなると、入れ物を増やし、各入れ物の範囲を狭める。デフォでは75%マップが埋まるとリハッシュする。O(1)。
    • HashMap: Hashtableのスレッドセーフではない版。内部で同期をとらないので速い。
    • LinkedHashMap: SortedMapの実装。マップ内のキーをソート順に格納する。
    • IdentityHashMap: キーを同値かどうかではなく同一かどうかで比較
    • WeakHashMap: マップ内で使用するキーが弱い参照(10章)で格納
    • TreeMap: SortedMapの実装。要素を二分木に格納。O(logn)だが、大量のデータの格納に向いている。
  • Set/SortedSet
    • HashSet: HashMapのキーのみを使用した実装。キーに対応する値はダミー値を入れている。
    • LinkedHashSet: 予測可能な反復順序を保証
    • TreeSet: TreeMapと同じ。
  • コレクション型の選択
    • キーで検索できる値が必要か?
      • 必要: Map
      • 不要: Collection
    • データの重複が必要か?
      • 必要: List
      • 不要: Set
    • データをソート順に格納する必要があるか?
      • 必要: SortedXXXの実装
      • 不要/ソート順に表示するだけで良い: その他
  • 注意点
    • プログラムの別の部分が、コレクション内のデータオブジェクトへの参照を持つ可能性がある
      • Collections.unmodifiableSet()を使うと修正不可能なセットをgetメソッドで返せる
    • ハッシュベースのコレクションでは、hashCode(とequals)メソッドをオーバライドすべき
      • バランスの良いMapを生成するためのハッシュコードを作成するようにすべき
    • 型の安全性の欠如

所感

  • 第4章の冒頭によると、公式フォーラムに寄せられる最も一般的な質問はコレクションクラスの使用方法に関するものらしい
  • コレクションの詳細はわかった(気がする)ので、実際に色々書いてみる