[Java の基礎] Java LinkedHashSet の詳細説明: 順序付けされた一意の要素のストレージに最適な選択肢

ここに画像の説明を挿入します

Java のコレクション フレームワークは、データを保存および操作するためのさまざまなデータ構造を提供します。LinkedHashSetハッシュ テーブルとリンク リストの特性を組み合わせた特殊な型で、要素の挿入順序を維持し、一意性を確保する必要がある場合に適しています。このブログでは、初心者がこのコレクション タイプをよりよく理解し、適用できるようにすることを目的として、その概念、機能、使用法、サンプル コードを含めて詳細に紹介しますLinkedHashSet

1. LinkedHashSet とは何ですか?

LinkedHashSetJava コレクション フレームワークのクラスであり、 を継承しているHashSetため、ハッシュ テーブルの検索性能を持ち、リンク リストを使用して要素の挿入順序を維持します。これは、LinkedHashSet次の 2 つの主要なプロパティがあることを意味します。

  • Order :LinkedHashSet要素の挿入順序は維持されます。つまり、要素がコレクションに追加される順序は、要素がコレクション内にある順序となります。
  • Uniqueness : と同じHashSetで、LinkedHashSet要素の一意性を保証し、要素の重複を許可しません。

したがって、LinkedHashSet一意の要素を挿入順に保存する必要があるシナリオには理想的な選択肢です。

2. LinkedHashSetの作成と初期化

オブジェクトを作成するにはLinkedHashSet、コンストラクターを使用してオブジェクトを初期化する必要があります。以下にいくつかの初期化方法を示します。

2.1. デフォルトのコンストラクター

LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();

LinkedHashSetこれにより、初期容量が 16、負荷係数が 0.75 の空のオブジェクトが作成されます。必要に応じてこれらのパラメータを調整できます。

2.2. 容量と負荷係数の指定

int initialCapacity = 20;
float loadFactor = 0.5f;
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(initialCapacity, loadFactor);

LinkedHashSet初期容量と負荷係数を指定することにより、のパフォーマンスとメモリ フットプリントをより詳細に制御できます。

2.3. 既存のコレクションから作成する

Listまたは、異なるコレクション タイプ間で変換するために、既存のコレクションからSetコレクションを作成することもできますLinkedHashSet

Set<String> existingSet = new HashSet<>(Arrays.asList("A", "B", "C"));
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(existingSet);

これにより、既存のコレクションの要素を使用して新しいコレクションが初期化されますLinkedHashSet

3. 基本操作: 要素の追加、削除、クエリ

LinkedHashSet要素の追加、削除、クエリなどの一般的なコレクション操作が提供されます。基本的な操作の例をいくつか示します。

3.1. 要素の追加

addメソッドを使用してLinkedHashSet要素を以下に追加します。

linkedHashSet.add("D");
linkedHashSet.add("E");

3.2. 要素の削除

removeメソッドLinkedHashSet使用して要素を削除します。

linkedHashSet.remove("B");

3.3. 要素が存在するかどうかのクエリ

このメソッドを使用して、contains要素が に存在するかどうかを確認しますLinkedHashSet

boolean containsC = linkedHashSet.contains("C");

4. LinkedHashSet をトラバースする

の要素を反復するLinkedHashSetには、通常、イテレータまたは拡張された for ループを使用します。以下に 2 つの走査方法の例を示します。

4.1. イテレータを使用したトラバース

Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {
    
    
    String element = iterator.next();
    System.out.println(element);
}

4.2. 拡張された for ループトラバーサルの使用

for (String element : linkedHashSet) {
    
    
    System.out.println(element);
}

走査方法に関係なく、LinkedHashSet要素は挿入された順序で返されるため、順序が維持されます。

5. LinkedHashSet のパフォーマンスに関する考慮事項

LinkedHashSetパフォーマンスはHashSetと同様で、要素を見つける時間計算量は O(1) で、これはハッシュ テーブルによって実現されます。ただしHashSet、とは異なり、LinkedHashSetリンクされたリスト構造を維持する必要があるため、要素の追加と削除はHashSetよりもわずかに遅くなる可能性があります。ただし、通常、このパフォーマンスの低下は無視できます。

LinkedHashSet初期容量と負荷率の設定がパフォーマンスに影響することに注意することが重要です。初期容量が小さすぎると、容量拡張操作が頻繁に行われ、パフォーマンスが低下する可能性があります。容量と負荷率を適切に選択すると、パフォーマンスが向上し、メモリ使用量が削減されます。

6. 使用上の注意

を使用するLinkedHashSet場合は、次の点を考慮する必要があります。

  • LinkedHashSetマルチスレッド環境で使用する場合は、スレッド同期の問題を考慮するか、スレッドセーフなコレクション クラスを考慮する必要がありますConcurrentLinkedHashSet
  • LinkedHashSet要素を保存することは許可されていますnullが、一般的には、null混乱やエラーを避けるために、有効な要素として保存しないことをお勧めします。
  • カスタム オブジェクトをLinkedHashSet要素として使用する場合は、hashCode()メソッドとequals()メソッドを正しく実装して、コレクション内のオブジェクトの一意性と正確性を確保する必要があります。
  • LinkedHashSet通常は非常に高いパフォーマンスを発揮しますが、大量のデータを処理する場合は、頻繁な拡張操作を避けるために負荷率の設定に注意する必要があります。

7. LinkedHashSet の例

いくつかのサンプルコードを使用して使用シナリオを示してみましょうLinkedHashSet

7.1. 生徒リストの保存

学生のリストを保存し、各学生の名前が追加された順序で一意であることを確認したいとします。これは次を使用して行うことができますLinkedHashSet

LinkedHashSet<String> studentNames = new LinkedHashSet<>();

studentNames.add("Alice");
studentNames.add("Bob");
studentNames.add("Charlie");
studentNames.add("Alice"); // 这个重复的元素将被忽略

for (String name : studentNames) {
    
    
    System.out.println(name);
}

出力:

Alice
Bob
Charlie

7.2. ウェブサイトの訪問履歴を記録する

ユーザーの Web サイトへの訪問履歴を記録し、訪問の順序を維持したいとします。これらのレコードを保存するために使用できますLinkedHashSet

LinkedHashSet<String> visitHistory = new LinkedHashSet<>();

visitHistory.add("Homepage");
visitHistory.add("About Us");
visitHistory.add("Products");
visitHistory.add("Contact Us");

for (String page : visitHistory) {
    
    
    System.out.println("Visited: " + page);
}

出力:

Visited: Homepage
Visited: About Us
Visited: Products
Visited: Contact Us

8. LinkedHashSet のさらなる使用法

を使用する場合LinkedHashSet、基本的な操作に加えて、いくつかの使用方法とテクニックがあります。

8.1. LinkedHashSet のサイズを取得する

size()このメソッドを使用して、LinkedHashSet次の要素の数を取得できます。

int size = linkedHashSet.size();

これはコレクションのサイズを理解し、データを処理するときに適切な制御と最適化を行うのに役立ちます。

8.2. LinkedHashSet が空かどうかを確認する

isEmpty()メソッドを使用してLinkedHashSetが空かどうかを確認します。コレクションに要素がない場合は戻り、trueそうでない場合は次を返しますfalse

boolean isEmpty = linkedHashSet.isEmpty();

これは、コレクションが空かどうかに基づいてさまざまなアクションを実行する条件付きロジックを作成する場合に便利です。

8.3. LinkedHashSet のクリア

内のすべての要素をクリアする必要がある場合は、次のメソッドをLinkedHashSet使用できます。clear()

linkedHashSet.clear();

これにより、コレクションが空になり、すべての要素が削除されます。

8.4. LinkedHashSet のコピー

コピーを作成する必要がある場合はLinkedHashSet、コンストラクターまたはclone()メソッドを使用できます。

LinkedHashSet<String> copySet = new LinkedHashSet<>(linkedHashSet);
// 或者
LinkedHashSet<String> copySet = (LinkedHashSet<String>) linkedHashSet.clone();

これにより、元のコレクションのクローンが作成され、元のコレクションに影響を与えることなく作業できるようになります。

8.5. 配列への変換

LinkedHashSetデータの柔軟性を高めるために要素を配列に変換できます。

String[] array = linkedHashSet.toArray(new String[0]);

これにより、コレクションの要素を含む配列が返されます。ニーズに応じて配列のタイプとサイズを選択することもできます。

8.6. LinkedHashSet の比較

2 つが等しいかどうかを比較するには、メソッドをLinkedHashSet使用できます。同じ要素を持ち、同じ順序で配置されている場合、equals()2 つは等しいとみなされます。LinkedHashSet

LinkedHashSet<String> set1 = new LinkedHashSet<>(Arrays.asList("苹果", "香蕉", "橙子"));
LinkedHashSet<String> set2 = new LinkedHashSet<>(Arrays.asList("苹果", "香蕉", "橙子"));

boolean isEqual = set1.equals(set2); // 返回 true

8.7. イテレータを使用した要素の削除

上で述べたように、イテレータを使用すると要素を安全に削除し、ConcurrentModificationException例外を回避できます。

Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {
    
    
    String element = iterator.next();
    if (element.equals("B")) {
    
    
        iterator.remove(); // 安全删除元素
    }
}

これらのより多くの使用方法とテクニックは、より柔軟にデータを処理し、さまざまなプログラミングのニーズを満たすのに役立ちますLinkedHashSetコレクションのサイズの取得、コレクションのクリア、コレクションのコピーの作成など、Java はLinkedHashSetさまざまなニーズを満たす豊富な機能を提供します。

9. まとめ

LinkedHashSetこれは、Java コレクション フレームワークにおける順序付けされた一意の要素ストレージ データ構造です。これは から継承しているHashSetため、ハッシュ テーブルの高速検索プロパティがあり、リンク リストを使用して要素の挿入順序を維持します。これは、要素を順序付けして一意に保つ必要がある状況で役立ちます。

を使用する場合LinkedHashSet、必要に応じて容量と負荷係数を制御し、パフォーマンスとメモリ使用量のバランスを取ることができます。また、要素の一意性が適切に処理されるように、カスタム オブジェクトhashCode()とメソッドを必ず実装してください。equals()

学生リストの保存、Web サイトの訪問履歴の記録、その他の整理された独自の要素の必要性を問わず、LinkedHashSetこれらの問題を簡単に解決できる信頼できるオプションです。LinkedHashSetこのブログが初心者の Java プログラミング スキルの理解と応用、そして Java プログラミング スキルの向上に役立つことを願っています。

おすすめ

転載: blog.csdn.net/qq_21484461/article/details/132818993
おすすめ