Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのLinkedHashMapとLinkedHashSetの特徴と使い方を徹底解説

Javaのコレクションフレームワークには、要素の順序を保持しながら高速な操作を実現できるクラスがいくつか用意されています。本記事では、その代表格であるLinkedHashMapLinkedHashSetについて、それぞれの特徴と具体的なコード例を交えてわかりやすく解説します。


LinkedHashMapとは

LinkedHashMapは、Mapインターフェースをハッシュテーブルとリンクリストの組み合わせで実装したクラスです。最大の特徴は、要素を挿入した順序(挿入順)どおりに反復処理できる点にあります。通常のHashMapでは格納順序が保証されませんが、LinkedHashMapを使えば予測可能な順序でデータを取り出すことができます。

コード例

import java.util.*;
public class Demo {
   public static void main(String args[]){
      LinkedHashMap<Integer, String> my_set;
      my_set = new LinkedHashMap<Integer, String>();
      my_set.put(67, "Joe");
      my_set.put(90, "Dev");
      my_set.put(null, "Nate");
      my_set.put(68, "Sara");
      my_set.put(69, "Amal");
      my_set.put(null, "Jake");
      my_set.put(69, "Ral");
      my_set.entrySet().stream().forEach((m) ->{
         System.out.println(m.getKey() + " " + m.getValue());
      });
   }
}

実行結果

67 Joe
90 Dev
null Jake
68 Sara
69 Ral

コードの解説

Demoという名前のクラス内にmainメソッドを定義し、その中でLinkedHashMapのインスタンスを生成しています。putメソッドを使って、Integer型のキーとString型の値のペアをマップへ順次追加していきます。

注目すべきは、キー「null」とキー「69」に対して複数回putを行っている点です。マップでは同一キーで再度putすると値が上書きされるため、最終的に「null → Jake」「69 → Ral」と表示されます。さらに、LinkedHashMapは挿入順を保持するため、出力結果もputした順番どおりになっています。最後にentrySetとforEachを使って各エントリを1件ずつ取り出し、キーと値をコンソールに出力しています。

LinkedHashSetとは

LinkedHashSetは、Setインターフェースをハッシュテーブルとリンクリストで実装したクラスです。重複する要素を持たないというSetの性質を保ちながら、要素を追加した順序どおりに反復処理できるのが大きな特徴です。内部的にはLinkedHashMapを利用しており、順序付きのセットが必要な場面で活躍します。

コード例

import java.util.*;
public class Demo {
   public static void main(String args[]){
      LinkedHashSet<String> my_set;
      my_set = new LinkedHashSet<String>();
      my_set.add("Joe");
      my_set.add("Dev");
      my_set.add("Nate");
      my_set.add("Sara");
      my_set.add("Amal");
      my_set.add("Jake");
      my_set.add("Ral");
      Iterator<String> my_itr = my_set.iterator();
      while (my_itr.hasNext()){
         System.out.println(my_itr.next());
      }
   }
}

実行結果

Joe
Dev
Nate
Sara
Amal
Jake
Ral

コードの解説

Demoクラスのmainメソッド内でLinkedHashSetのインスタンスを作成し、addメソッドを使って7つの文字列要素を追加しています。その後、iteratorメソッドでイテレータを取得し、hasNextメソッドで次の要素の有無を確認しながら、nextメソッドで要素を1件ずつ取り出してコンソールに表示しています。

出力結果を見ると、要素が追加した順序(Joe、Dev、Nate…)どおりに表示されていることが確認できます。もし通常のHashSetを使用していた場合、この順序は保証されないため注意が必要です。

まとめ

LinkedHashMapとLinkedHashSetは、どちらも「挿入順の保持」という共通の特徴を持つコレクションクラスです。順序が重要になるデータ処理や、アクセス順に基づくキャッシュの実装などで特に有用なので、用途に応じて適切に使い分けるとよいでしょう。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. Javaで文字列と16進数を相互に変換する方法を解説

    文字列を16進数(Hexadecimal)に変換するJavaでは、IntegerクラスのtoHexString()メソッドを使うと、整数を引数として渡すだけで16進数表記の文字列を取得できます。このメソッドを利用して、文字列全体を16進数に変換する手順は以下のとおりです。対象となる文字列を用意します。空のStringBufferオブジェクトを作成します。StringクラスのtoCharArray()メソッドで、文字列をchar型の配列に変換します。ループ処理で、配列の各要素を順番に取り出します。ループ内で各文字をint型に変換し、その値をInteger.toHexString()メソッドに渡し