コレクションとジェネリクス完全攻略ガイド|Java Gold SE11頻出ポイント徹底解説

【Java Gold対策】

Java Gold試験において、「コレクション & ジェネリクス」はほぼ確実に出題される超重要分野です。
しかも単純な知識問題ではなく、「コンパイル通る?」「実行結果どうなる?」系の引っかけ問題が中心。

この記事では、試験対策として必要なポイントを、実務にも役立つ形でわかりやすく解説します。


目次

コレクションとは?(基本のおさらい)

コレクションとは、複数のデータを扱うための仕組みです。

代表的なものは以下

インターフェース主な実装クラス特徴
ListArrayList順序あり・重複OK
SetHashSet重複NG
MapHashMapキーと値のペア

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>();

  1. 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

ここを完璧にすれば、合格にかなり近づきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

tibiyaのアバター tibiya ITエンジニア

文系卒あほエンジニア
趣味はゲームとギャンブルとテニスっぽいスポーツと釣りです
Java javascript angular react C#

コメント

コメントする

目次