Java Silver試験で頻出の「主要API」に関する問題を10問収録しました。List/ArrayListの操作、Collections.sort()、List.of()、LocalDate/LocalTime/LocalDateTime、ラムダ式、Predicate/Consumer/Function/Supplierなど、試験で問われやすいポイントを網羅しています。
問題1 ⭐(基本)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add(1, "X");
System.out.println(list);
}
}
- A.
[A, B, C, X] - B.
[A, X, B, C] - C.
[X, A, B, C] - D. コンパイルエラー
解答と解説
正解: B
add(int index, E element)はインデックス位置に要素を挿入します。既存の要素は右にシフトされます。
初期状態: [A, B, C]
add(1, "X") → インデックス1に"X"を挿入 → [A, X, B, C]
add(E element)(引数1つ)は末尾に追加、add(int index, E element)(引数2つ)は指定位置に挿入という違いに注意してください。
問題2 ⭐⭐(応用)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = List.of("A", "B", "C");
list.add("D");
System.out.println(list);
}
}
- A.
[A, B, C, D] - B.
[A, B, C] - C. コンパイルエラー
- D. 実行時エラー(
UnsupportedOperationException)
解答と解説
正解: D
List.of()は不変(immutable)リストを返します。不変リストに対してadd()、remove()、set()などの変更操作を行うと、UnsupportedOperationExceptionがスローされます。
同様に、List.copyOf()も不変リストを返します。
変更可能なリストが必要な場合は:
List<String> mutable = new ArrayList<>(List.of("A", "B", "C"));
mutable.add("D"); // OK
List.of()で生成したリストはnull要素を含めることもできません(NullPointerExceptionがスローされます)。
問題3 ⭐⭐(応用)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Banana");
list.add("Apple");
list.add("Cherry");
Collections.sort(list);
System.out.println(list);
System.out.println(list.contains("apple"));
System.out.println(list.indexOf("Banana"));
}
}
- A.
[Apple, Banana, Cherry]→true→1 - B.
[Apple, Banana, Cherry]→false→1 - C.
[Banana, Apple, Cherry]→false→0 - D.
[Apple, Banana, Cherry]→false→0
解答と解説
正解: B
Collections.sort()は自然順序(Stringの場合はUnicode辞書順)でソートします。結果は[Apple, Banana, Cherry]です。
contains("apple")は大文字小文字を区別するため、"apple"(小文字)は見つからずfalseを返します。
indexOf("Banana")はソート後のリスト[Apple, Banana, Cherry]でのインデックスを返します。"Banana"はインデックス1にあります。
問題4 ⭐⭐(応用)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.remove(1);
System.out.println(list);
System.out.println(list.size());
}
}
- A.
[10, 30]→2 - B.
[20, 30]→2 - C.
[10, 20, 30]→2 - D. 実行時エラー
解答と解説
正解: A
list.remove(1)はインデックス1の要素を削除します。List<Integer>に対してremove(int index)とremove(Object o)の両方が候補になりますが、intリテラル1はオートボクシングされずにremove(int index)が優先されます。
初期状態: [10, 20, 30]
remove(1) → インデックス1の要素(20)を削除 → [10, 30]
値1のIntegerオブジェクトを削除したい場合は:
list.remove(Integer.valueOf(1)); // remove(Object)が呼ばれる
問題5 ⭐(基本)
次のコードをコンパイル・実行すると、どうなりますか?
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 31);
date.plusMonths(1);
System.out.println(date);
}
}
- A.
2025-02-28 - B.
2025-01-31 - C.
2025-03-01 - D. 実行時エラー
解答と解説
正解: B
LocalDateは不変(immutable)オブジェクトです。plusMonths(1)は新しいLocalDateオブジェクトを返しますが、元のdateは変更されません。戻り値を使わなければ元のオブジェクトのまま出力されます。
正しい使い方:
LocalDate newDate = date.plusMonths(1);
System.out.println(newDate); // 2025-02-28
LocalDate、LocalTime、LocalDateTime、Stringはすべて不変オブジェクトです。変更メソッドは常に新しいオブジェクトを返すことを覚えておいてください。
問題6 ⭐⭐(応用)
次のコードをコンパイル・実行すると、どうなりますか?
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 6, 15);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dt = LocalDateTime.of(date, time);
System.out.println(dt.getYear());
System.out.println(dt.getMonthValue());
System.out.println(dt.getHour());
}
}
- A.
2025→6→14 - B.
2025→JUNE→14 - C.
2025→6→2 - D. コンパイルエラー
解答と解説
正解: A
LocalDateTime.of(LocalDate, LocalTime)で日付と時刻を組み合わせてLocalDateTimeを生成できます。
-
getYear()→2025(intを返す) -
getMonthValue()→6(intを返す、1〜12) -
getHour()→14(intを返す、0〜23)
getMonth()はMonth列挙型(JUNEなど)を返す点に注意してください。getMonthValue()はint(1〜12)を返します。
問題7 ⭐⭐(応用)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>(List.of("Java", "Python", "JavaScript", "C"));
Predicate<String> longName = s -> s.length() > 4;
list.removeIf(longName);
System.out.println(list);
}
}
- A.
[Java, Python, JavaScript] - B.
[Java, C] - C.
[Python, JavaScript] - D. コンパイルエラー
解答と解説
正解: B
Predicate<T>はTを受け取りbooleanを返す関数型インターフェースです。test(T t)メソッドを持ちます。
removeIf(Predicate)は条件に一致する要素を削除します。s.length() > 4がtrueになる要素:
-
"Java"→ 長さ4 →false(残る) -
"Python"→ 長さ6 →true(削除) -
"JavaScript"→ 長さ10 →true(削除) -
"C"→ 長さ1 →false(残る)
結果: [Java, C]
問題8 ⭐⭐⭐(チャレンジ)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<String> supplier = () -> "Hello";
Function<String, Integer> function = s -> s.length();
Consumer<Integer> consumer = n -> System.out.println("Length: " + n);
String value = supplier.get();
Integer length = function.apply(value);
consumer.accept(length);
}
}
- A.
Length: 5 - B.
Hello - C.
5 - D. コンパイルエラー
解答と解説
正解: A
4つの主要な関数型インターフェース:
| インターフェース | メソッド | 引数 | 戻り値 |
|---|---|---|---|
Supplier<T> |
get() |
なし | T |
Consumer<T> |
accept(T) |
T |
なし(void) |
Function<T,R> |
apply(T) |
T |
R |
Predicate<T> |
test(T) |
T |
boolean |
実行順序:
-
supplier.get()→"Hello"を返す -
function.apply("Hello")→"Hello".length()→5を返す -
consumer.accept(5)→"Length: 5"を出力
問題9 ⭐⭐⭐(チャレンジ)
次のコードをコンパイル・実行すると、どうなりますか?
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.parse("2025-13-01");
System.out.println(date);
}
}
- A.
2025-13-01 - B.
2026-01-01 - C. コンパイルエラー
- D. 実行時エラー(
DateTimeParseException)
解答と解説
正解: D
LocalDate.parse()はデフォルトでISO_LOCAL_DATE形式(yyyy-MM-dd)を期待します。月の値13は不正な値(1〜12の範囲外)なので、java.time.format.DateTimeParseExceptionがスローされます。
LocalDate.of(2025, 13, 1)も同様にDateTimeExceptionをスローします。Date and Time APIは厳密なバリデーションを行います(旧java.util.Dateとは異なり、自動的に繰り越しません)。
正しい使い方:
LocalDate date = LocalDate.parse("2025-12-01"); // OK
LocalDate date2 = LocalDate.of(2025, 12, 1); // OK
問題10 ⭐⭐⭐(チャレンジ)
次のコードをコンパイル・実行すると、どうなりますか?
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
List<String> names = new ArrayList<>(List.of("Alice", "Bob", "Charlie", "David"));
Predicate<String> startsWithC = s -> s.startsWith("C");
Predicate<String> longName = s -> s.length() > 3;
Predicate<String> combined = startsWithC.or(longName);
Function<String, String> toUpper = String::toUpperCase;
names.removeIf(combined.negate());
names.replaceAll(toUpper::apply);
System.out.println(names);
}
}
- A.
[ALICE, CHARLIE, DAVID] - B.
[BOB] - C.
[ALICE, BOB, CHARLIE, DAVID] - D. コンパイルエラー
解答と解説
正解: A
ステップごとに解説します。
combined = startsWithC.or(longName) → "Cで始まる" または "長さが3超"
各要素の判定:
-
"Alice"→ Cで始まらない、長さ5 > 3 →true -
"Bob"→ Cで始まらない、長さ3 > 3ではない →false -
"Charlie"→ Cで始まる →true -
"David"→ Cで始まらない、長さ5 > 3 →true
combined.negate() → 上記の結果を反転:
-
"Alice"→false(削除しない) -
"Bob"→true(削除する) -
"Charlie"→false(削除しない) -
"David"→false(削除しない)
removeIf(combined.negate()) → "Bob"が削除される → [Alice, Charlie, David]
replaceAll(toUpper::apply) → 各要素を大文字に変換 → [ALICE, CHARLIE, DAVID]
Predicateの合成メソッド:
-
and()→ 両方trueでtrue -
or()→ いずれかtrueでtrue -
negate()→ 結果を反転
参考
- Oracle Java SE 17 API - java.util.List
- Oracle Java SE 17 API - java.util.ArrayList
- Oracle Java SE 17 API - java.time.LocalDate
- Oracle Java SE 17 API - java.util.function
- Oracle Java Tutorials - Lambda Expressions
@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!