前回はDate/Time APIを使って日付・時刻を扱う方法を学びました。
今回は「Set」について解説します。 ArrayListは重複した値を何個でも追加できますが、Setを使うと同じ値を1つしか持てないコレクションを作れます。「重複を排除したい」「含まれているか素早く確認したい」という場面で力を発揮します。
Setの基本
Set は重複した値を持てないコレクションのインターフェースです。Javaでよく使われるSetの実装クラスは以下の2つです。
HashSet: 順番は保証されないが、検索が高速LinkedHashSet: 追加した順番を保持するTreeSet: 自然順(アルファベット順・数値順など)に並べて保持する
今回は最もよく使われる HashSet を中心に解説します。使うにはインポートが必要です。
import java.util.HashSet;
import java.util.Set;
基本的な書き方はArrayListと似ています。
Set<データ型> 変数名 = new HashSet<>();
サンプルコード(HashSetの基本操作)
ファイル作成
「Java17」フォルダに HashSetTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.util.HashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set<String> fruits = new HashSet<>();
// データの追加
fruits.add("apple");
fruits.add("banana");
fruits.add("cherry");
fruits.add("apple"); // 重複 → 追加されない
System.out.println("要素数: " + fruits.size());
System.out.println("中身: " + fruits);
// 含まれているか確認
System.out.println("\n\"apple\"は含まれる?: " + fruits.contains("apple"));
System.out.println("\"grape\"は含まれる?: " + fruits.contains("grape"));
// 要素の削除
fruits.remove("banana");
System.out.println("\n\"banana\"を削除しました");
System.out.println("中身: " + fruits);
// 全要素を表示
System.out.println("\n--- 一覧 ---");
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}

コンパイル
javac HashSetTest.java

実行
java HashSetTest
実行結果は次のようになります(HashSetは順番が保証されないため、表示順は毎回異なる場合があります)。
要素数: 3
中身: [banana, apple, cherry]
"apple"は含まれる?: true
"grape"は含まれる?: false
"banana"を削除しました
中身: [apple, cherry]
--- 一覧 ---
apple
cherry

サンプルコード(SetとListの違いを確認する)
SetとListを組み合わせた「リストから重複を取り除く」プログラムを作ってみましょう。
ファイル作成
「Java17」フォルダに DuplicateRemoveTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class DuplicateRemoveTest {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("ぱんまる");
names.add("たろう");
names.add("ぱんまる");
names.add("はなこ");
names.add("たろう");
names.add("ぱんまる");
System.out.println("元のリスト: " + names);
System.out.println("要素数: " + names.size());
// HashSetで重複を排除(順番は保証されない)
Set<String> hashSet = new HashSet<>(names);
System.out.println("\nHashSetで重複排除: " + hashSet);
System.out.println("要素数: " + hashSet.size());
// LinkedHashSetで重複を排除(追加順を保持)
Set<String> linkedSet = new LinkedHashSet<>(names);
System.out.println("\nLinkedHashSetで重複排除: " + linkedSet);
System.out.println("要素数: " + linkedSet.size());
// Setを再びListに戻す
List<String> uniqueList = new ArrayList<>(linkedSet);
System.out.println("\n重複排除後のList: " + uniqueList);
}
}

コンパイル
javac DuplicateRemoveTest.java

実行
java DuplicateRemoveTest
実行結果は次のようになります。
元のリスト: [ぱんまる, たろう, ぱんまる, はなこ, たろう, ぱんまる]
要素数: 6
HashSetで重複排除: [はなこ, たろう, ぱんまる]
要素数: 3
LinkedHashSetで重複排除: [ぱんまる, たろう, はなこ]
要素数: 3
重複排除後のList: [ぱんまる, たろう, はなこ]

コードの解説
fruits.add("apple") を2回呼んでいますが、Setは重複を許さないため、2回目の追加は無視されます。add() の戻り値は boolean で、追加に成功すれば true、重複で追加されなければ false が返ります。
contains() はSetの大きな強みのひとつです。ArrayListの contains() はすべての要素を先頭から順に確認するため、要素数が増えるほど時間がかかりますが、HashSetの contains() はハッシュという仕組みにより、要素数に関係なく高速に確認できます。大量のデータの中から「含まれているかどうか」を素早く確認したい場合にHashSetが向いています。
new HashSet<>(names) のように、既存のListをコンストラクタに渡すだけで、Listの内容をSetに変換できます。重複は自動的に取り除かれます。順番を保ちたい場合は LinkedHashSet を使いましょう。
new ArrayList<>(linkedSet) のように、SetをListに戻すことも簡単にできます。「重複排除してからListに戻す」という流れは実際の開発でよく使われるパターンです。
まとめ
Setを使うことで、重複なしのデータ管理ができます。add で追加(重複は無視)、contains で高速な存在確認、remove で削除という基本操作を覚えておきましょう。順番を気にしない場合は HashSet、追加順を保ちたい場合は LinkedHashSet、ソート順にしたい場合は TreeSet を使い分けます。ListとSetは互いに変換できるため、「重複排除してListに戻す」パターンもぜひ覚えておいてください。これでList・Map・Setと、Javaのコレクションの主要な3種類をすべて学んだことになります。
2026/07/07(火) ぱんまる


コメント