Java LinkedHashSet完全マスター:特徴、メソッド、実践例
Java LinkedHashSet
このチュートリアルでは、例を用いてJavaのLinkedHashSetクラスとそのメソッドについて学習します。
JavaコレクションフレームワークのLinkedHashSetクラスは、ハッシュテーブルとリンクリストの両データ構造の機能を提供します。
Setインターフェースを実装します。

LinkedHashSetの要素は、HashSetと同様にハッシュテーブルに格納されます。
しかし、リンクハッシュセットは内部的にすべての要素に対して双方向リンクリストを維持します。このリンクリストがハッシュテーブルでの要素挿入順序を定義します。
LinkedHashSetの作成
リンクハッシュセットを作成するには、まずjava.util.LinkedHashSetパッケージをインポートする必要があります。
インポート後、Javaでリンクハッシュセットを作成する方法は以下の通りです。
// 容量8、負荷係数0.75のLinkedHashSet
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
ここで、numbersというリンクハッシュセットを作成しました。
new LinkedHashSet<>(8, 0.75)の部分に注目してください。最初のパラメータはcapacity、2番目のパラメータはloadFactorです。
- capacity - このハッシュセットの容量は8。つまり、8要素まで格納可能
- loadFactor - このハッシュセットの負荷係数は0.6。ハッシュテーブルが60%満杯になると、要素は元の2倍サイズの新しいハッシュテーブルに移動
デフォルトの容量と負荷係数
容量と負荷係数を定義せずにリンクハッシュセットを作成することも可能です。例:
// デフォルト容量と負荷係数のLinkedHashSet
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
デフォルトでは、
- リンクハッシュセットの容量は16
- 負荷係数は0.75
他のコレクションからLinkedHashSetを作成
他のコレクションのすべての要素を含むリンクハッシュセットを作成する方法:
import java.util.LinkedHashSet;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
// 偶数のArrayListを作成
ArrayList<Integer> evenNumbers = new ArrayList<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("ArrayList: " + evenNumbers);
// ArrayListからLinkedHashSetを作成
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
System.out.println("LinkedHashSet: " + numbers);
}
}
出力
ArrayList: [2, 4] LinkedHashSet: [2, 4]
LinkedHashSetのメソッド
LinkedHashSetクラスは、リンクハッシュセット上でさまざまな操作を実行するメソッドを提供します。
LinkedHashSetへの要素挿入
add()- 指定要素をリンクハッシュセットに挿入addAll()- 指定コレクションのすべての要素をリンクハッシュセットに挿入
例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>();
// add()メソッドの使用
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("LinkedHashSet: " + evenNumber);
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
// addAll()メソッドの使用
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("新しいLinkedHashSet: " + numbers);
}
}
出力
LinkedHashSet: [2, 4, 6] 新しいLinkedHashSet: [2, 4, 6, 5]
LinkedHashSet要素へのアクセス
リンクハッシュセットの要素にアクセスするには、iterator()メソッドを使用します。このメソッドを使用するには、java.util.Iteratorパッケージをインポートする必要があります。例:
import java.util.LinkedHashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("LinkedHashSet: " + numbers);
// iterator()メソッドの呼び出し
Iterator<Integer> iterate = numbers.iterator();
System.out.print("Iterator使用: ");
// 要素へのアクセス
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
出力
LinkedHashSet: [2, 5, 6] Iterator使用: 2, 5, 6,
注意:
hasNext()はリンクハッシュセットに次の要素があればtrueを返すnext()はリンクハッシュセットの次の要素を返す
HashSetからの要素削除
remove()- 指定要素をリンクハッシュセットから削除removeAll()- リンクハッシュセットからすべての要素を削除
例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("LinkedHashSet: " + numbers);
// remove()メソッドの使用
boolean value1 = numbers.remove(5);
System.out.println("5は削除されたか? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("すべての要素が削除されたか? " + value2);
}
}
出力
LinkedHashSet: [2, 5, 6] 5は削除されたか? true すべての要素が削除されたか? true
セット操作
LinkedHashSetクラスのさまざまなメソッドは、各種セット操作の実行にも使用できます。
和集合
2つのセットの和集合にはaddAll()メソッドを使用。例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("LinkedHashSet1: " + evenNumbers);
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(1);
numbers.add(3);
System.out.println("LinkedHashSet2: " + numbers);
// 2つのセットの和集合
numbers.addAll(evenNumbers);
System.out.println("和集合: " + numbers);
}
}
出力
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] 和集合: [1, 3, 2, 4]
積集合
2つのセットの積集合にはretainAll()メソッドを使用。例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("LinkedHashSet1: " + primeNumbers);
LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("LinkedHashSet2: " + evenNumbers);
// 2つのセットの積集合
evenNumbers.retainAll(primeNumbers);
System.out.println("積集合: " + evenNumbers);
}
}
出力
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] 積集合: [2]
差集合
2つのセットの差集合にはremoveAll()メソッドを使用。例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
primeNumbers.add(5);
System.out.println("LinkedHashSet1: " + primeNumbers);
LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();
oddNumbers.add(1);
oddNumbers.add(3);
oddNumbers.add(5);
System.out.println("LinkedHashSet2: " + oddNumbers);
// LinkedHashSet1とLinkedHashSet2の差集合
primeNumbers.removeAll(oddNumbers);
System.out.println("差集合: " + primeNumbers);
}
}
出力
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] 差集合: [2]
部分集合
あるセットが別のセットの部分集合かどうかをチェックするにはcontainsAll()メソッドを使用。例:
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("LinkedHashSet1: " + numbers);
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("LinkedHashSet2: " + primeNumbers);
// primeNumbersがnumbersの部分集合かチェック
boolean result = numbers.containsAll(primeNumbers);
System.out.println("LinkedHashSet2はLinkedHashSet1の部分集合か? " + result);
}
}
出力
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] LinkedHashSet2はLinkedHashSet1の部分集合か? true
LinkedHashSetのその他のメソッド
| メソッド | 説明 |
|---|---|
clone() | LinkedHashSetのコピーを作成 |
contains() | 指定要素をLinkedHashSetで検索しboolean結果を返す |
isEmpty() | LinkedHashSetが空かどうかチェック |
size() | LinkedHashSetのサイズを返す |
clear() | LinkedHashSetからすべての要素を削除 |
LinkedHashSetメソッドの詳細については、Java LinkedHashSet(公式Javaドキュメント)を参照してください。
LinkedHashSet vs HashSet
LinkedHashSetとHashSetの両方がSetインターフェースを実装します。しかし、いくつかの違いがあります。
LinkedHashSetは内部的にリンクリストを維持するため、要素の挿入順を保持LinkedHashSetクラスはHashSetより多くのストレージを必要とする。内部的にリンクリストを維持するためLinkedHashSetのパフォーマンスはHashSetより遅い。リンクリストが存在するため
LinkedHashSet vs TreeSet
LinkedHashSetとTreeSetの主な違いは以下の通り:
TreeSetクラスはSortedSetインターフェースを実装。そのためツリーセットの要素はソートされる。しかし、LinkedHashSetクラスは要素の挿入順のみを維持TreeSetは通常LinkedHashSetより遅い。要素追加時にソート操作を実行するためLinkedHashSetはnull値の挿入を許可。しかし、TreeSetにはnull値を挿入できない
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較