ホームページ  >  記事  >  Java  >  Java における HashSet と TreeSet の主な違い

Java における HashSet と TreeSet の主な違い

PHPz
PHPzオリジナル
2024-08-23 18:02:32313ブラウズ

Top Key Differences Between HashSet and TreeSet in Java

1. HashSet と TreeSet の概要

違いを詳しく説明する前に、HashSet と TreeSet が何であるかを簡単に確認しましょう。

1.1 ハッシュセットとは何ですか?

HashSet は、ストレージにハッシュ テーブルを使用するコレクションです。 Set インターフェイスを実装します。つまり、要素の重複は許可されません。要素は順序付けされておらず、並べ替えられていないため、HashSet は高速な検索、挿入、削除が必要なシナリオに適しています。

1.2 ツリーセットとは何ですか?

TreeSet は、NavigableSet インターフェイスを実装するコレクションです。格納には Red-Black ツリーが使用されます。これは、要素が並べ替えられ、順序付けられた方法で格納されることを意味します。 TreeSet も要素の重複を許可しませんが、要素の自然な順序を維持する必要がある状況には理想的です。

2. HashSet と TreeSet の主な違い

2.1 注文

  • HashSet : 要素の順序は維持されません。要素が追加される順序は、要素が格納される順序と相関しません。
  • TreeSet : 自然な順序付けまたは指定されたコンパレーターに基づいて要素を自動的に順序付けします。

2.2 パフォーマンス

  • HashSet : 追加、削除、包含などの基本的な操作に定数時間計算量 O(1) を提供し、順序が問題にならない場合は処理を大幅に高速化します。
  • TreeSet : 要素はツリー構造に格納されるため、基本的な操作に log(n) 時間の計算量を提供しますが、ハッシュベースの構造よりも時間がかかります。

2.3 内部記憶機構

HashSet : 内部的にハッシュ テーブルを使用します。各要素のハッシュ コードは、その格納場所を決定するために使用されます。 2 つの要素が同じハッシュ コードを持つ場合、チェーンまたはプローブと呼ばれる手法が衝突を処理するために使用されます。

コード例:

Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Mango");

TreeSet : 赤黒ツリーを内部的に使用します。各要素はその自然な順序または提供されたコンパレータに従って配置され、ツリーのバランスが保たれるようにします。

コード例:

Set<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Mango");

2.4 ヌル要素

  • HashSet : null 値をハッシュできるため、null 要素を 1 つ許可します。
  • TreeSet : null 要素は許可されません。要素を並べ替えるために要素を比較する必要があり、null をオブジェクトと比較すると NullPointerException がスローされるためです。

2.5 同期

  • HashSet : デフォルトでは同期されませんが、Collections.synchronizedSet.
  • を使用して同期できます。
  • TreeSet : これもデフォルトでは同期されませんが、同じ方法で同期できます。

2.6 要素の重複

HashSetTreeSet はどちらも要素の重複を許可しません。ただし、重複を検出する方法が異なります。 HashSethashCode () および equals () メソッドを使用しますが、TreeSet は compareTo () または Comparator

2.7 メモリ使用量

  • HashSet : 一般に、基盤となるハッシュ テーブルとリンク リストが衝突を処理する可能性があるため、より多くのメモリが必要です。
  • TreeSet : ツリー構造を使用するため、使用するメモリは少なくなりますが、順序を維持する際のオーバーヘッドが大きくなります。

2.8 LinkedHashSetとの比較

HashSetLinkedHashSet : HashSet は順序を保証しませんが、LinkedHashSet は挿入順序を維持します。一方、 TreeSet は、要素を自然に、またはカスタム コンパレータによって並べ替えます。

2.9 使用例

  • HashSet : 高速アクセス時間に重点が置かれ、順序が重要ではない場合に最適です。
  • TreeSet : 要素にソートされた順序でアクセスする必要があるシナリオに最適です。

2.10 デモ結果: 反復順序

以下のコード スニペットを実行すると、反復順序の違いがわかります。

// HashSet Example
Set<String> hashSet = new HashSet<>();
hashSet.add("Zebra");
hashSet.add("Apple");
hashSet.add("Mango");
System.out.println("HashSet: " + hashSet); 
// Output may be unordered, e.g., [Apple, Mango, Zebra]

// TreeSet Example
Set<String> treeSet = new TreeSet<>();
treeSet.add("Zebra");
treeSet.add("Apple");
treeSet.add("Mango");
System.out.println("TreeSet: " + treeSet); 
// Output will be sorted, e.g., [Apple, Mango, Zebra]

3. 結論

HashSet と TreeSet のどちらを選択するかは、結局のところ、特定のニーズに応じて決まります。

  • 要素の順序を気にせずに高パフォーマンスのセットが必要な場合は、HashSet を使用します。
  • 要素を自然に並べ替えたり、カスタム順序で並べ替えたりする必要がある場合は、TreeSet を使用します。

ご質問はありますか?以下にお気軽にコメントを書き込んでください。

で投稿の詳細をお読みください: Java における HashSet と TreeSet の主な違いトップ 10

以上がJava における HashSet と TreeSet の主な違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。