Java Gold試験において、「コレクション & ジェネリクス」はほぼ確実に出題される超重要分野です。
しかも単純な知識問題ではなく、「コンパイル通る?」「実行結果どうなる?」系の引っかけ問題が中心。
この記事では、試験対策として必要なポイントを、実務にも役立つ形でわかりやすく解説します。
コレクションとは?(基本のおさらい)
コレクションとは、複数のデータを扱うための仕組みです。
代表的なものは以下
| インターフェース | 主な実装クラス | 特徴 |
|---|---|---|
| List | ArrayList | 順序あり・重複OK |
| Set | HashSet | 重複NG |
| Map | HashMap | キーと値のペア |
Java Goldで重要なポイント①:型安全(ジェネリクス)
ジェネリクスとは、扱うデータの型を制限する仕組みです。
List<String> list = new ArrayList<>();
list.add("Hello");
これにより👇
- String以外は追加できない
- キャスト不要
- コンパイル時にエラー検出
Java Goldでは「型安全=超重要」
Java Goldで重要なポイント②:ワイルドカード(?)
ここは試験の“鬼門”です。
基本形
List<?> list
どんな型でも受け取れるが…
- 追加(add)は基本できない
- 取り出しはObject扱い
上限境界(extends)
List<? extends Number>
👉 NumberのサブクラスならOK
- 読み取り専用になる
- addはできない
下限境界(super)
List<? super Integer>
👉 Integerの親クラス
- addはできる
- 取り出しはObjectになる
Java Gold頻出ポイント③:コンパイルエラー判定
試験ではこれが一番出ます。
NG例
List<Object> list = new ArrayList<String>(); // コンパイルエラー
👉 理由:
- ジェネリクスは共変じゃない(不変)
OK例
List<?> list = new ArrayList<String>();
👉 ワイルドカードならOK
Java Gold頻出ポイント④:型推論(var)
var list = new ArrayList<String>();
👉 型は ArrayList<String> として推論される
⚠️ よくある罠
var list = new ArrayList<>();
👉 型が曖昧 → 意図しない型になる可能性あり
Java Gold頻出ポイント⑤:コレクション操作
よく出るメソッド👇
- add()
- remove()
- contains()
- size()
特に注意👇
list.remove(1); // index削除
list.remove("A"); // 値削除
👉 オーバーロードの違いが出題される
試験でよくある問題パターン
【第1問】ジェネリクスの代入
次のコードのうち、コンパイルエラーになるものはどれですか? A. List<Object> list = new ArrayList<Object>(); B. List<Object> list = new ArrayList<String>(); C. List<?> list = new ArrayList<String>();
List<? extends Number> list = new ArrayList<Integer>();
正解:B ジェネリクスは「不変(Invariant)」です。たとえStringがObjectのサブクラスであっても、
List<Object>にArrayList<String>を代入することはできません。
【第2問】ワイルドカード(上限境界)
次のコードの説明として正しいものはどれですか? List<? extends Number> list = new ArrayList<Integer>(); list.add(10); A. 正常にコンパイルされ、10が追加される B. 実行時に ClassCastException が発生する C. list.add(10) の行でコンパイルエラーが発生する D. ArrayList<Integer> を代入している行でコンパイルエラーが発生する
正解:C
? extends T(上限境界)は「読み取り専用」です。中身が何であるか確定できないため、null以外の要素を追加することはできません。
【第3問】ワイルドカード(下限境界)
次のコードを実行した結果として正しいものはどれですか? List<? super Integer> list = new ArrayList<Number>(); list.add(10); Object obj = list.get(0); A. コンパイルエラー B. 実行時に例外が発生する C. 正常に動作し、objには10が格納される D. list.add(10) はできるが、取り出しはInteger型でなければならない
正解:C
? super T(下限境界)は、Tおよびそのサブクラスを追加(add)できます。ただし、取り出すときはどの親クラスか不明なため、Object型として扱われます。
【第4問】Listのremoveメソッド(int)
以下のコードの出力結果は何ですか? List<Integer> list = new ArrayList<>(); list.add(10); list.add(20); list.add(30); list.remove(1); System.out.println(list); A. [20, 30] B. [10, 30] C. [10, 20] D. [10, 20, 30]
正解:B
remove(int index)が優先されます。インデックス「1」の要素、つまり「20」が削除されます。
【第5問】Listのremoveメソッド(Object)
以下のコードの出力結果は何ですか? List<Integer> list = new ArrayList<>(); list.add(10); list.add(20); list.remove(Integer.valueOf(10)); System.out.println(list); A. [10, 20] B. [10] C. [20] D. コンパイルエラー
正解:C
Integer.valueOf(10)はオブジェクト(Object)として渡されるため、インデックスではなく「値としての10」が検索されて削除されます。
【第6問】ダイヤモンド演算子とvar
次のコードのうち、コンパイルエラーになるものはどれですか? A. var list = new ArrayList<String>(); B. List<String> list = new ArrayList<>(); C. var list = new ArrayList<>(); D. var list = (List<String>) new ArrayList<String>();
正解:C
varとダイヤモンド演算子<>を同時に使うと、型を推論するための情報が足りず、ArrayList<Object>と見なされたり意図しない挙動になるため、Java Goldの文脈では「型安全ではない」ひっかけとして出されます(※厳密にはコンパイルは通りますが、試験では型推論の罠として狙われます)。
【第7問】Iteratorの操作
次のコードを実行した結果はどうなりますか? List<String> list = new ArrayList<>(List.of("A", "B")); for (String s : list) { if (s.equals("A")) list.remove(s); } A. [B] B. [A, B] C. ConcurrentModificationException がスローされる D. コンパイルエラー
正解:C 拡張for文(Iterator)のループ内で、Listのメソッドを使って要素を削除しようとすると、構造変更の不整合により実行時に例外がスローされます。削除には
Iterator.remove()を使う必要があります。
【第8問】Mapのメソッド
Map<Integer, String> map = new HashMap<>(); map.put(1, "A"); map.putIfAbsent(1, "B"); map.put(2, "C"); System.out.println(map.get(1) + map.get(2)); A. AB B. AC C. BC D. BC
正解:B
putIfAbsentは、指定されたキーがまだ存在しない(またはnull)場合のみ値を入れます。すでにキー「1」には「A」があるため、無視されます。
【第9問】Setの性質
以下のコードの実行結果はどうなりますか? Set<String> set = new HashSet<>(); set.add("A"); set.add("a"); set.add("A"); System.out.println(set.size()); A. 1 B. 2 C. 3 D. 4
正解:B Setは重複を許しません。「A」は2回追加しても1件として扱われますが、大文字・小文字は区別されるため、「A」と「a」で合計2件となります。
【第10問】ジェネリックメソッドの定義
正しいジェネリックメソッドの宣言はどれですか? A. public <T> T method(T t) { return t; } B. public T <T> method(T t) { return t; } C. public method<T>(T t) { return t; } D. public <T> method(T t) { return t; }
正解:A 型パラメータ <T> は、戻り値の型の直前に記述する必要があります。
まとめ
Java Goldのコレクション & ジェネリクスは👇
- 型安全が超重要
- ワイルドカードは必須理解
- コンパイルエラー問題が頻出
- 「読める力」が合否を分ける
最後に
この分野は最初つまずきやすいですが、
一度理解すると得点源になります。
特に👇
? extends? super
ここを完璧にすれば、合格にかなり近づきます。


コメント