Java における HashSet と TreeSet の主な違い
Aug 23, 2024 pm 06:02 PM1. 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 要素の重複
HashSet と TreeSet はどちらも要素の重複を許可しません。ただし、重複を検出する方法が異なります。 HashSet は hashCode () および equals () メソッドを使用しますが、TreeSet は compareTo () または Comparator。
2.7 メモリ使用量
- HashSet : 一般に、基盤となるハッシュ テーブルとリンク リストが衝突を処理する可能性があるため、より多くのメモリが必要です。
- TreeSet : ツリー構造を使用するため、使用するメモリは少なくなりますが、順序を維持する際のオーバーヘッドが大きくなります。
2.8 LinkedHashSetとの比較
HashSet と LinkedHashSet : 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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?
