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