CodeGym /Java Blog /ランダム /JavaのLinkedHashSet
John Squirrels
レベル 41
San Francisco

JavaのLinkedHashSet

ランダム グループに公開済み
Java のLinkedHashSetクラスについて言えば、 Setインターフェイスを実装していることを言及する必要があります。LinkedHashSet は、ハッシュ テーブルに要素を格納するコレクションを作成しますが、HashSetの対応物とは異なり、要素の挿入順序を維持します。

Javaで設定されるもの

Setインターフェイスがセット (セット) を定義することを簡単に思い出してください。これはCollectionを拡張し、要素の重複を許可しないコレクションの動作を定義します。したがって、重複した要素をセットに追加しようとすると、add()メソッドはfalseを返します。このインターフェイスは、独自の追加メソッドを定義しません。Setインターフェイスは、格納されたオブジェクトの一意性を処理します。一意性はequals()メソッドの実装によって決まります。したがって、作成したクラスのオブジェクトをSetに追加する場合は、 equals()メソッドをオーバーライドすることが望ましいです。

LinkedHashSet クラス

LinkedHashSetクラスについて説明する前に、その密接な関係であるHashSetクラスについて言及する必要があります。HashSet はSetインターフェイスを実装します。要素をハッシュ テーブルに格納するコレクションを作成します。ハッシュ テーブルの要素は、キーと値のペアとして保存されます。キーは、値を格納するセル (またはセグメント) を指定します。キーの内容は、ハッシュ コードと呼ばれる一意の値を決定するために使用されます。ハッシュ コードはオブジェクト識別子と考えることができますが、一意である必要はありません。このハッシュ コードは、キーに関連付けられたデータが格納されるインデックスとしても機能します。LinkedHashSet Java クラスは、新しいメソッドを追加せずにHashSetを拡張します。LinkedHashSet を使用すると、 HashSetと同様に、エントリの存在をすばやく確認できますが、内部には順序付きリストが含まれています。これは、要素の挿入順序を保存することを意味します。言い換えれば、LinkedHashSet は、挿入された順序でセット要素のリンクされたリストを維持します。これにより、セットへの挿入を順序立てて反復できるようになります。ただし、これにより、LinkedHashSetクラスの操作の実行時間がHashSetクラスより長くなります。

LinkedHashSet の重要な機能

  • 固有の要素はLinkedHashSetにのみ保存できます

  • LinketHashSet を使用すると、挿入したのと同じ順序で要素を抽出できます

  • LinkedHashSetが同期されていません

  • LinkedHashSet ではnull 要素の保存が可能

  • LinkedHashSet は、ハッシュ技術を使用して、ハッシュ コードに基づいて指定されたインデックスに要素を格納します

LinkedHashSet メソッド

親クラスから継承されたメソッドに加えて、HashSet は次のメソッドを定義します。
  • boolean add(Object o) は、指定された要素がこのセットにまだ存在しない場合に追加します。

  • void clear() は、このセットからすべての要素を削除します。

  • Object clone()は、このLinkedHashSetインスタンスの浅いコピーを返します。要素自体は複製されません。

  • boolean contains(Object o) は、このセットに指定された要素が含まれている場合に true を返します。

  • boolean isEmpty() は、このセットに要素が含まれていない場合にtrueを返します。

  • イテレータ iterator() は、このセットの要素に対するイテレータを返します。

  • boolean remove(Object o) は、指定された要素が存在する場合、このセットから削除します。

  • int size() は、このセット内の要素の数 (その要素の数) を返します。

簡単な LinkedHashSet の例 以下の例では、 LinkedHashSetオブジェクトの初期化と、 add()メソッドを使用してセットを埋める方法を示します。

import java.util.LinkedHashSet;
import java.util.Set;

   public class LinkedHashSetEx1 {
       public static void main(String[] args) {
//LinkedHashSet() Init            
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet 
           set.add("Re"); //first added element 
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");//last added element  


           System.out.println(set);
       }
   }
出力は次のとおりです。
[レ・ド・ファ・ソル・ラ・ティ・ミ]
ご覧のとおり、セット内の要素は配置したのと同じ順序で表示されます。 Java の LinkedHashSet - 1

例 2. LinkedHashSet への重複の追加

楽譜の名前を持つ LinkedHashSet 7 要素を再度配置し、前に配置した要素の 1 つと同じ新しい要素を 1 つ配置しましょう。

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetEx2 {
   public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           set.add("Sol");
           System.out.println(set);
       }
   }
プログラムの出力は次のとおりです。
[レ・ド・ファ・ソル・ラ・ティ・ミ]
例 2 の出力は、最初の例とまったく同じです。 LinkedHashSetコレクション内に 2 つの類似した要素を含めることはできません。2 番目のものを入力しようとすると、無視されます。

例 3. LinkedHashSet からの要素の削除


import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           System.out.println(set);
           set.remove("Fa");// removing an element from our set
           set.remove("Score");//trying to remove element that isn't in set
           System.out.println(set.remove("Score"));
           System.out.println("Print our set without elements removed: ");
           System.out.println(set);
           set.clear();
           System.out.println("Print out our set after clear command: ");
           System.out.println(set);
       }
   }
プログラムの出力は次のとおりです。
[Re、Do、Fa、Sol、La、Ti、Mi] false 要素を削除せずにセットを出力します: [Re、Do、Sol、La、Ti、Mi] クリアコマンドの後にセットを出力します: []
ご覧のとおり、存在しない要素に Remove()メソッドを適用してもプログラム エラーは発生しません。要素が削除されなかった場合は単純に falseを返し、要素が LinkedHashSet内にあった後で削除された場合は true を返します。

LinkedHashSet と HashSet の比較

これら 2 つのクラスは近い親戚です。ただし、 HashSetの内部では HashMapを使用してオブジェクトを保存しますが、 LinkedHashSet は LinkedHashMapを使用します。挿入順序を維持する必要はないが、一意のオブジェクトを保存する必要がある場合は、 HashSetを使用する方が適切です。要素の挿入順序を維持する必要がある場合は、 LinkedHashSetを選択してください。 LinkedHashSet は内部 LinkedListを使用して要素の挿入順序を維持するため、 LinkedHashSetのパフォーマンスは HashSetよりも少し遅くなります。例を見てみましょう:

import java.util.*;

public class LinkedHashSetExample1 {

   public static void main(String[] args) {
       // while regular hash set orders its elements according to its hashcode stamps

       Set<Integer> regularHashSet = new HashSet<>();
       regularHashSet.add(7);
       regularHashSet.add(3);
       regularHashSet.add(5);
       regularHashSet.add(65536);
       regularHashSet.add(9);
       // few duplicates
       regularHashSet.add(5);
       regularHashSet.add(7);

       // next will print:
       // > regularHashSet = [65536, 3, 5, 7, 9]
       System.out.println("regularHashSet = " + regularHashSet);

       // linked hash set keeps order of adding unchanged

       Set<Integer> linkedHashSet = new LinkedHashSet<>();
       linkedHashSet.add(7);
       linkedHashSet.add(3);
       linkedHashSet.add(5);
       linkedHashSet.add(65536);
       linkedHashSet.add(9);
       // few duplicates
       linkedHashSet.add(5);
       linkedHashSet.add(7);

       // next will print:
       // > linkedHashSet = [7, 3, 5, 65536, 9]
       System.out.println("linkedHashSet = " + linkedHashSet);
   }
}
プログラムの出力は次のとおりです。
RegularHashSet = [65536, 3, 5, 7, 9] linkedHashSet = [7, 3, 5, 65536, 9]

実際のアプリケーションでの Java LinkedHashSet の使用

LinkedHashSet を使用すると、エントリの存在をすばやく確認でき、順序も保存できるため、このコレクションはリストから重複を削除するのに非常に便利と思われます。または、たとえば、バッグの中で最後に見たアイテムなどの問題を解決することもできます。あるいは、ポケモン GO というゲームを覚えていますか? LinkedHashSet は、あなたが遭遇したポケモンのリストと、パス上で遭遇した順序を保存できます。この場合、「繰り返し」のポケモンはリストに追加されなくなります。または、たとえば、レベルのあるゲームですでに遭遇したレベル別のボスのリスト。あるいは宇宙天体の発見の歴史。 リンクされたハッシュセットを使用すると、スペース ボディがリストに既に存在するかどうかをすばやく確認し、存在しない場合はリストに追加できます。重複を削除する例を見てみましょう。

import java.util.*;

class LinkedHashSetExample2 {
   public static void main(String[] args) {
       List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");

       Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
       List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);

       // next will print:
       // > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
       System.out.println("listWithDuplicates = " + listWithDuplicates);
       // next will print:
       // > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
       System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);

       // -------------------------------------------------------------------------

       // while using regular Hash Set will generally produces some unexpected order
       Set<String> regularHashSet = new HashSet<>(listWithDuplicates);

       // next will print:
       // > linkedHashSet = [some, elements, with, few, duplicates, were, here]
       System.out.println("linkedHashSet = " + linkedHashSet);
       // next will print:
       // > regularHashSet = [here, some, with, duplicates, were, elements, few]
       System.out.println("regularHashSet = " + regularHashSet);
   }
}
プログラムの出力は次のとおりです。
listWithDuplicates = [いくつかの要素、ある、いくつかの重複、ここに、重複、重複] listWithoutDuplicates = [いくつかの要素、ある、いくつかの重複、ここにある] linkedHashSet = [いくつかの要素、ある、いくつかの重複、あった、ここ] RegularHashSet = [ここ、一部、重複、あった、要素、少数]
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION