「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java における HashSet と TreeSet の主な違い

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

2024 年 11 月 5 日に公開
ブラウズ:614

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 hashSet = new HashSet();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Mango");

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

コード例:

Set 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 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 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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/anh_trntun_4732cf3d299/top-10-key-differences-between-hashset-and-treeset-in-java-49f3?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3