JavaのTreeSetとHashSetの違いとは?特徴と使い分けを徹底解説
Javaのコレクションフレームワークには、重複しない要素を管理するためのSet系のクラスが複数用意されています。その代表格であるHashSetとTreeSetは、どちらも「要素の重複を許さない」という共通点を持つ一方で、内部構造や並び順、nullの扱いなどに大きな違いがあります。
HashSetはSetインターフェースを実装しており、内部的にはHashMapによってデータを保持します。一方、TreeSetはSortedSet(NavigableSet)インターフェースを実装しており、内部ではTreeMap(赤黒木)によってデータを管理しています。
HashSetとTreeSetの主な違い(比較表)
| 番号 | 項目 | HashSet | TreeSet |
|---|---|---|---|
| 1 | 実装方式 | ハッシュテーブル(HashMap)を基盤として実装されている | 木構造(TreeMap/赤黒木)を基盤として実装されている |
| 2 | nullの扱い | nullを1つだけ格納できる | nullは格納できない(NullPointerExceptionがスローされる) |
| 3 | 比較方法 | equals()メソッドを使って2つのオブジェクトを比較する | compareTo()/compare()メソッドを使って2つのオブジェクトを比較する |
| 4 | 異種オブジェクト | 型の異なるオブジェクトも格納できる | 自然順序付けでは異種オブジェクトを格納できない(ClassCastExceptionが発生) |
| 5 | 並び順 | 要素の順序は一切保証されない | 要素が常にソートされた順序で維持される |
TreeSetの使用例
class TreeSetExample {
public static void main(String[] args){
TreeSet<String> treeset = new TreeSet<String>();
treeset.add("Good");
treeset.add("For");
treeset.add("Health");
// 重複する要素を追加
treeset.add("Good");
System.out.println("TreeSet : ");
for (String temp : treeset) {
System.out.println(temp);
}
}
}
出力結果
TreeSet :
For
Good
Health
TreeSetは要素を自動的に辞書順(昇順)にソートして格納していることがわかります。また、「Good」を2回追加しても重複分は無視され、1回のみ格納されます。
HashSetの使用例
class HashSetExample {
public static void main(String[] args){
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("Good");
hashSet.add("For");
hashSet.add("Health");
// 重複する要素を追加
hashSet.add("Good");
System.out.println("HashSet: ");
for (String temp : hashSet) {
System.out.println(temp);
}
}
}
出力結果
HashSet:
Health
For
Good
HashSetは挿入順やソート順を保証せず、ハッシュ値に基づく独自の順序で要素を返します。そのため、実行環境やJDKのバージョンによって出力順序が変わる場合があります。
使い分けのポイント
- 検索・追加・削除を高速に行いたい(平均O(1))場合や、要素の順序が不要な場合はHashSetが適しています。
- 常にソートされた状態で要素を管理したい場合や、範囲検索を行いたい場合はTreeSet(操作はO(log n))が適しています。
このように、両者は用途に応じて使い分けることで、より効率的で可読性の高いJavaプログラムを実現できます。
-
JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説
はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って