JavaのSetとは何か | 重複を許さないコレクションの基本解説
この記事でわかること
- よく使われるSetの種類を知ることができます
- JavaのSetがどんな場面で使われるのかわかります
- Listとの明確な違いを理解できます
- Setの基本的な使い方を学べます
- 重複がどう扱われるかを理解できます
Setとは何か
Setは、同じ値を1つしか持てないコレクションです
Listと同じく複数のデータを扱えますが、重複を自動で排除してくれる点が最大の特徴です
たとえば、同じユーザー名やIDが複数登録されるのを防ぎたい場合に向いています
ListとSetの違い
ここで一度、Listとの違いを整理しておきます
| 項目 | List | Set |
|---|---|---|
| 順番 | 保持される | 基本的に保証されない |
| 重複 | 可能 | 不可 |
| インデックス | あり | なし |
| 主な用途 | 順番付きのデータ | 重複を許さないデータ |
- 順番や位置が必要ならList
- 重複を防ぎたいならSet
この使い分けがとても大事です
Setを使う準備
SetもListと同じくインターフェースなので、実装クラスを使います
一番よく使われるのは HashSet です
import java.util.HashSet
import java.util.Set
Set<String> names = new HashSet<>()要素を追加する
Setでは add メソッドを使って要素を追加します
names.add("ネコ")
names.add("イヌ")
names.add("ネコ")この場合、Setの中身は次のようになります
| 値 |
|---|
| ネコ |
| イヌ |
同じ値を追加しても、Setには1つしか残りません
エラーにはならず、静かに無視されるのが特徴です
要素が存在するか確認する
Setでは contains を使って、要素の存在確認ができます
if (names.contains("ネコ")) {
System.out.println("登録されています")
}検索が速いのもSetの強みです
要素を削除する
削除は remove を使います
names.remove("イヌ")Setにはインデックスがないため、値そのものを指定します
要素数を取得する
要素数は size で取得できます
System.out.println(names.size())| コレクション | 要素数取得 |
|---|---|
| 配列 | length |
| List | size() |
| Set | size() |
ここはListと共通なので覚えやすいです
ループでSetを扱う
Setはインデックスを持たないため、基本的に拡張for文を使います
for (String name : names) {
System.out.println(name)
}順番は保証されないので、出力順が毎回変わる可能性があります
よく使われるSetの種類
Setにはいくつか種類があります
| 種類 | 特徴 |
|---|---|
| HashSet | 高速で一般的 |
| LinkedHashSet | 追加順を保持 |
| TreeSet | 自然順でソートされる |
- 順番が必要な場合は
LinkedHashSet - 並び順を整えたい場合は
TreeSet
用途に応じて選びます
Setを使うときの注意点
- インデックスでの取得はできません
- 重複チェックは
equalsが基準になります - 順番を前提にした処理には向いていません
Setは「集合」として考えると理解しやすくなります
まとめ
Setは、重複を許さないデータを扱うためのコレクションです
Listとの違いを理解し、順番が不要で一意性が重要な場面で使うと、とても強力です
特にデータの重複チェックや存在確認では、Setの便利さを実感できるようになります