問1
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation {
String value() default "default";
String description() default new String("default description");
}
@MyAnnotation
public class Test {
public static void main(String[] args) {
MyAnnotation annotation = Test.class.getAnnotation(MyAnnotation.class);
System.out.println("Value: " + annotation.value());
System.out.println("Description: " + annotation.description());
}
}
選択肢
- このコードは正常にコンパイルされ、"default" と "default description" が出力される
- このコードはコンパイルエラーになる。アノテーションのメンバにはデフォルト値を指定できない
- このコードはコンパイルエラーになる。アノテーションのメンバに
new
によるインスタンス化式をデフォルト値として使用できない - このコードは実行時エラーが発生する
解答
正解: 3. このコードはコンパイルエラーになる。アノテーションのメンバに `new` によるインスタンス化式をデフォルト値として使用できない解説:
アノテーションのメンバにはデフォルト値を指定できますが、そのデフォルト値として使用できるのは定数(プリミティブ型、String
、Enum
、Class
など)に限られます。new
によるインスタンス化式をデフォルト値として指定することはできないため、このコードはコンパイルエラーになります。
問2
class SuperClass {
public void method() throws Exception {
System.out.println("SuperClass method");
}
}
class SubClass extends SuperClass {
@Override
public void method() {
System.out.println("SubClass method");
}
}
public class Test {
public static void main(String[] args) {
SuperClass obj = new SubClass();
obj.method();
}
}
選択肢
- このコードは正常にコンパイルされ、"SubClass method" が出力される
- このコードはコンパイルエラーになる。
SubClass
のmethod
でthrows Exception
を指定する必要がある - このコードは正常にコンパイルされ、"SuperClass method" が出力される
- このコードは実行時エラーになる
解答
正解: 1. このコードは正常にコンパイルされ、"SubClass method" が出力される解説:
スーパークラスのメソッドが throws
節を持っている場合、サブクラスでそのメソッドをオーバーライドする際に throws
節を記述しないことは可能です。つまり、サブクラスのメソッドは例外をスローしないように変更することができます。そのため、このコードは正常にコンパイルされ、実行すると "SubClass method" が出力されます。
問3
import java.io.*;
public class TryWithResourceReassignment {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
System.out.println(line);
reader = new BufferedReader(new FileReader("anotherfile.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
選択肢
- file.txtの内容がすべて出力される
- コンパイルエラーになる
- file.txtの内容が一行だけ出力される
- 実行時エラーになる可能性がある
解答
正解: 2. コードはコンパイルエラーになる。解説:
try-with-resources
ステートメント内で宣言された変数(ここでは reader
)は、その try
ブロック内で再代入することはできません。
問4
class Outer {
private int num = 10;
class Inner {
private int num = 20;
void display() {
int num = 30;
class LocalInner {
void print() {
System.out.println(num);
System.out.println(Inner.this.num);
System.out.println(Outer.this.num);
}
}
new LocalInner().print();
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
選択肢
-
30
,20
,10
が順に表示される -
10
,20
,30
が順に表示される - コンパイルエラーが発生する
- 実行時エラーが発生する
解答
正解: 1. `30`, `20`, `10` が順に表示される解説:
コードでは、3つの異なるスコープに同じ名前の変数 num
が定義されています。それぞれのスコープは以下のように解釈されます:
-
num
はdisplay
メソッド内のローカル変数(30
)。 -
Inner.this.num
はInner
クラスのメンバ変数(20
)。 -
Outer.this.num
はOuter
クラスのメンバ変数(10
)。
そのため、出力は順に 30
, 20
, 10
となります。
問5
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("One");
queue.add("Two");
queue.add(null);
System.out.println("Peek: " + queue.peek());
System.out.println("Element: " + queue.element());
System.out.println("Poll: " + queue.poll());
System.out.println("Remove: " + queue.remove());
System.out.println("Peek after remove: " + queue.peek());
}
}
選択肢
-
peek()
とelement()
は "One" を返し、poll()
は "One" を削除し、remove()
はnull
を削除し、再度peek()
は "Two" を返す -
peek()
とelement()
は "One" を返し、poll()
は "One" を削除し、remove()
は "Two" を削除し、再度peek()
はnull
を返す -
peek()
とelement()
は "One" を返し、poll()
は "One" を削除し、remove()
はnull
を削除し、再度peek()
はnull
を返す -
peek()
は "One" を返し、element()
は "One" を返し、poll()
は "One" を削除し、remove()
は "Two" を削除し、再度peek()
はnull
を返す
解答
正解: 1. `peek()` と `element()` は "One" を返し、`poll()` は "One" を削除し、`remove()` は `null` を削除し、再度 `peek()` は "Two" を返す解説: peek()
と element()
はキューの先頭要素である "One" を返します。poll()
メソッドは先頭要素を返し、それを削除しますが、null
要素も削除できます。remove()
メソッドは次の先頭要素である "Two" を削除します。最後に peek()
メソッドは残りの "Two" を返します。
問6
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class PreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:yourdb";
String user = "user";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement("SELECT name FROM your_table WHERE id = ?")) {
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();
String name = rs.getString("name");
System.out.println("Name: " + name);
} catch (Exception e) {
e.printStackTrace();
}
}
}
選択肢
-
SQLException
がスローされる -
name
にはデータベースの最初のレコードの値が設定される -
name
にはnull
が設定される -
name
には空文字が設定される
解答
正解: 1. `SQLException` がスローされるResultSet
の next()
メソッドを呼ばずに getString()
メソッドを呼び出すと、ResultSet
が現在の行を指していないため、SQLException
がスローされます。
問7
import java.util.ResourceBundle;
public class ResourceBundleExample {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("messages");
String key = "greeting";
Object message = bundle.getObject(0);
System.out.println(message);
}
}
選択肢
-
int
型の引数をgetObject()
メソッドに渡すことができます。 -
int
型の引数はgetObject()
メソッドに渡すことはできません。 -
int
型の引数を渡す場合、戻り値はint
型になります。 -
int
型の引数を渡すと、ResourceBundle
に存在しないキーとして扱われます。
解答
正解: 2. `int` 型の引数は `getObject()` メソッドに渡すことはできません。ResourceBundle
の getObject()
メソッドには、String
型のキーを渡してローカライズされたオブジェクトを取得する必要があります。
問8
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
try {
System.out.println("Element: " + queue.element());
} catch (NoSuchElementException e) {
System.out.println("Exception: " + e);
}
try {
System.out.println("Remove: " + queue.remove());
} catch (NoSuchElementException e) {
System.out.println("Exception: " + e);
}
}
}
選択肢
-
element()
メソッドはnull
を返し、remove()
メソッドはNoSuchElementException
をスローする -
element()
メソッドはNoSuchElementException
をスローし、remove()
メソッドはNoSuchElementException
をスローする -
element()
メソッドはNoSuchElementException
をスローし、remove()
メソッドはnull
を返す -
element()
メソッドはnull
を返し、remove()
メソッドはnull
を返す
解答
正解: 2. `element()` メソッドは `NoSuchElementException` をスローし、`remove()` メソッドは `NoSuchElementException` をスローする解説: Queue
インターフェイスの element()
メソッドは、キューが空の場合に NoSuchElementException
をスローします。同様に、remove()
メソッドもキューが空の場合には NoSuchElementException
をスローします。どちらのメソッドも、空のキューに対しては null
を返すことはありません。
問9
public class GenericClass<T> {
private T value;
public GenericClass(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public static <T> void staticMethod() {
}
public static void main(String[] args) {
GenericClass<String> instance = new GenericClass<>("Test");
System.out.println(instance.getValue());
GenericClass.<String>staticMethod();
}
}
選択肢
- ジェネリクスを用いた
static
メソッドはコンパイルエラーになる -
static
メソッドはジェネリクスを用いることができるが、クラスのインスタンスを生成する必要がある -
static
メソッドにジェネリクスは使えないが、インスタンスメソッドには使える -
static
メソッドにジェネリクスを使うことはできるが、static
メソッド内でT
を直接使用できる
解答
正解: 1. ジェネリクスを用いた `static` メソッドはコンパイルエラーになる解説: static
メソッドはクラスに関連付けられているため、ジェネリクスの型パラメータ T
を直接使用することはできません。static
メソッドはジェネリクスの型パラメータに依存せずに設計されるべきであり、ジェネリクスを使用する場合は static
メソッド内で型パラメータを使わずにメソッドを定義する必要があります。
問10
public class GenericUtil<T> {
private T value;
public GenericUtil(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public static <T> void printValue(T value) {
System.out.println(value);
}
public static void main(String[] args) {
GenericUtil<String> stringUtil = new GenericUtil<>("Hello");
stringUtil.printValue("Static Method");
}
}
選択肢
-
static
メソッドprintValue
はジェネリクスを使用することができ、型パラメータT
をメソッドの引数に指定できる -
static
メソッドprintValue
にはジェネリクスを使用することができるが、型パラメータT
はクラスのインスタンスを介してしか使用できない -
static
メソッドprintValue
にはジェネリクスを使用することができず、型パラメータはクラスレベルでのみ定義される -
static
メソッドprintValue
にはジェネリクスを使用することができるが、型パラメータT
はクラスのインスタンス変数としてのみ使用できる
解答
正解: 1. `static` メソッド `printValue` はジェネリクスを使用することができ、型パラメータ `T` をメソッドの引数に指定できる解説: static
メソッドにおいてもジェネリクスを使用することができます。この場合、static
メソッドは型パラメータ T
をメソッドの引数として受け取ることができ、メソッド内で型パラメータに基づいた処理を行うことが可能です。ジェネリクスの型パラメータは、メソッドのスコープ内で適切に使用できます。
問11
import java.util.*;
public class ComparatorDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
Comparator<String> comparator = Comparator.reverseOrder();
Collections.sort(list, comparator);
System.out.println("Sorted list with reverseOrder(): " + list);
comparator = comparator.reversed();
Collections.sort(list, comparator);
System.out.println("Sorted list with reversed(): " + list);
}
}
選択肢
-
reverseOrder()
は逆順でソートし、reversed()
は元の順序に戻す。 -
reverseOrder()
はComparatorを返し、reversed()
はそのComparatorの順序を反転する。 -
reverseOrder()
はComparatorを返し、reversed()
はリストを逆順にソートする。 -
reverseOrder()
とreversed()
は同じ動作をする。
解答
正解: 2. `reverseOrder()`はComparatorを返し、`reversed()`はそのComparatorの順序を反転する。reverseOrder()
メソッドは、要素を逆順に比較するComparatorを返します。一方、reversed()
メソッドは、既存のComparatorの順序を逆にした新しいComparatorを返します。このため、reverseOrder()
は新しいComparatorを作成し、reversed()
は既存のComparatorの順序を反転します。
問12
import java.util.function.IntToDoubleFunction;
public class LambdaExample {
public static void main(String[] args) {
IntToDoubleFunction f = (Integer i) -> { return i * 1.08; };
System.out.println(f.applyAsDouble(10));
}
}
選択肢
-
IntToDoubleFunction
はint
型の引数を受け取るため、Integer
型の引数を渡すとコンパイルエラーになる。 -
IntToDoubleFunction
はInteger
型の引数を受け取るため、int
型の引数を渡すとコンパイルエラーになる。 -
IntToDoubleFunction
はint
型の引数をInteger
型の引数に自動的に変換するため、コンパイルエラーは発生しない。 -
IntToDoubleFunction
はInteger
型の引数を受け取るため、int
型の引数を渡すとコンパイルエラーになる。
解答
正解: 1. `IntToDoubleFunction`は`int`型の引数を受け取るため、`Integer`型の引数を渡すとコンパイルエラーになる。IntToDoubleFunction
はint
型の引数を受け取る関数型インターフェイスです。そのため、Integer
型の引数を使用すると自動的な型変換が行われず、コンパイルエラーが発生します。ラムダ式の引数が関数型インターフェイスの型と一致する必要があります。
問13
検索結果が存在しないケースの出力を答えてください
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ResultSetExample {
public static void main(String[] args) {
String url = "jdbc:yourdb";
String user = "user";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM your_table WHERE 1=0")) {
if (rs.next()) {
System.out.println("Data found!");
} else {
System.out.println("No data found.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
選択肢
- Data found!
- No data found.
- 実行時に例外が出る
-
ResultSet
のカラムにデフォルト値が設定される
解答
正解: 2. No data found.executeQuery
メソッドは、検索結果がない場合でも ResultSet
オブジェクトを返しますが、その ResultSet
は空です。つまり、ResultSet
自体は null
にはならず、結果がない場合には rs.next()
が false
を返します。
問14
import java.io.*;
public class SuppressedExceptionsExample {
public static void main(String[] args) {
try {
throw new IOException("Main Exception");
} catch (IOException e) {
try (FileInputStream fis = new FileInputStream("file.txt")) {
throw new IOException("Suppressed Exception");
} catch (IOException suppressed) {
e.addSuppressed(suppressed);
}
System.out.println("Caught exception: " + e.getMessage());
System.out.println("Suppressed exceptions: ");
for (Throwable t : e.getSuppressed()) {
System.out.println(t.getMessage());
}
}
}
}
選択肢
- コードはコンパイルエラーになる。
e.addSuppressed(suppressed);
の行でエラーが発生する - コードは正常にコンパイルされ、
e.getSuppressed()
メソッドで抑制された例外を取得できる - コードはコンパイルエラーになる。
suppressed
変数がcatch
ブロック外で使用されているためエラーが発生する - コードは正常にコンパイルされるが、
e.getSuppressed()
メソッドで抑制された例外は取得できない
解答
正解: 2. コードは正常にコンパイルされ、`e.getSuppressed()` メソッドで抑制された例外を取得できる解説:
Javaでは、try-with-resources
ステートメントで管理されるリソースがクローズされる際に、抑制された例外が発生する可能性があります。Exception.addSuppressed(Throwable)
メソッドを使用して、発生した例外を抑制された例外として追加することができます。Throwable.getSuppressed()
メソッドで抑制された例外を取得することができ、これにより、リソースクローズ中に発生した例外も確認できます。この問題のコードは正常にコンパイルされ、抑制された例外を正しく取得することができます。
問15
import java.util.function.Predicate;
public class NegateExample {
public static void main(String[] args) {
Predicate<Integer> isPositive = x -> x > 0;
Predicate<Integer> isNotPositive = isPositive.negate();
System.out.println(isNotPositive.test(5));
System.out.println(isNotPositive.test(-3));
System.out.println(isNotPositive.test(0));
}
}
選択肢
-
isNotPositive.test(5)
はfalse
、isNotPositive.test(-3)
はtrue
、isNotPositive.test(0)
はfalse
を出力する。 -
isNotPositive.test(5)
はtrue
、isNotPositive.test(-3)
はfalse
、isNotPositive.test(0)
はtrue
を出力する。 -
isNotPositive.test(5)
はfalse
、isNotPositive.test(-3)
はtrue
、isNotPositive.test(0)
はtrue
を出力する。 -
isNotPositive.test(5)
はtrue
、isNotPositive.test(-3)
はtrue
、isNotPositive.test(0)
はfalse
を出力する。
解答
正解: 3. `isNotPositive.test(5)` は `false`、`isNotPositive.test(-3)` は `true`、`isNotPositive.test(0)` は `true` を出力する。negate
メソッドは、元のPredicate
の条件を反転させた新しいPredicate
を生成します。元のPredicate
が x > 0
の場合、negate
されたPredicate
は x <= 0
となります。したがって、isNotPositive.test(5)
は false
、isNotPositive.test(-3)
は true
、isNotPositive.test(0)
も true
となります。
問16
import java.lang.annotation.*;
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface TypeUseAnnotation {}
public class Test {
public static void main(String[] args) {
@TypeUseAnnotation String testString = "Hello";
String @TypeUseAnnotation [] testArray = new String[10];
for (String str : testArray) {
str = testString;
}
}
}
選択肢
- このコードは正常にコンパイルされる
-
@TypeUseAnnotation
は配列の宣言部分に適用できないため、コンパイルエラーが発生する -
@TypeUseAnnotation
はローカル変数testString
に適用できないため、コンパイルエラーが発生する -
@TypeUseAnnotation
はElementType.TYPE_USE
ではなくElementType.LOCAL_VARIABLE
を使用すべきため、コンパイルエラーが発生する
解答
正解: 1. このコードは正常にコンパイルされる解説:
@TypeUseAnnotation
は ElementType.TYPE_USE
が指定されているため、型の使用箇所に適用できます。これには、変数の型や配列の要素の型、ジェネリック型の指定などが含まれます。このため、testString
や testArray
の宣言部分にアノテーションを適用しても正常にコンパイルされます。
問17
public class Test {
public void method() {
final class LocalClass1 {}
private class LocalClass2 {}
protected class LocalClass3 {}
abstract class LocalClass4 {}
}
}
選択肢
- このコードは正常にコンパイルされる
-
final
修飾子を持つローカルクラスはコンパイルエラーになる -
private
修飾子を持つローカルクラスはコンパイルエラーになる -
abstract
修飾子を持つローカルクラスはコンパイルエラーになる
解答
正解: 3. `private` 修飾子を持つローカルクラスはコンパイルエラーになる解説:
ローカルクラスにはアクセス修飾子(public
, private
, protected
)を付けることはできません。final
や abstract
修飾子はローカルクラスに使用できます。このため、private class LocalClass2
と protected class LocalClass3
の行でコンパイルエラーが発生します。
問18
import java.util.stream.IntStream;
public class IterateExample {
public static void main(String[] args) {
IntStream stream = IntStream.iterate(1, n -> n + 2, n -> n >= 10);
stream.forEach(System.out::print);
}
}
選択肢
-
13579
を出力する。 -
13579
と出力した後に10
を出力する。 -
13579
を出力し、最後に10
を出力する。 - コンパイルエラーになる
解答
正解: 4. コンパイルエラーになる `static IntStream iterate(int seed, IntPredicate hasNext, IntUnaryOperator next)` iterateメソッドの引数の順番が間違っています。 次のように修正すると結果が出力されます。 `Stream stream = Stream.iterate(1, n -> n < 10, n -> n + 2);`問19
import java.util.stream.Stream;
public class StreamCountExample {
public static void main(String[] args) {
Stream<String> stream = Stream.of("A", "B", "C", "D");
int count = (int) stream.count();
System.out.println(count);
}
}
選択肢
- コンパイルエラーになる
-
4
が出力される -
0
が出力される -
4
が出力され、その後にエラーが発生する
解答
正解: 1. コンパイルエラーになるStream.count()
メソッドの戻り値は long
型であり、これを int
型の変数に代入しようとすると、コンパイルエラーが発生します。正しくはキャストを使用して long
型を int
型に変換する必要があります。
問20
import java.util.function.BinaryOperator;
import java.util.stream.IntStream;
public class StreamReduceExample {
public static void main(String[] args) {
BinaryOperator<Integer> operator = (a, b) -> a + b;
IntStream stream = IntStream.of(1, 2, 3, 4, 5);
int result = stream.reduce(0, operator);
System.out.println(result);
}
}
選択肢
-
15
を出力する - コンパイルエラーになる
- 実行時エラーが発生する
-
0
を出力する
解答
正解: 2. コンパイルエラーになるIntStream.reduce()
メソッドでは、引数に IntBinaryOperator
を指定する必要があります。BinaryOperator<Integer>
は IntStream
ではなく、Stream<Integer>
用の演算子であるため、コンパイルエラーが発生します。IntStream
用には IntBinaryOperator
を使用する必要があります。
問21
次のコマンドがjdeps
に関する正しい使い方であるのはどれですか?
jdeps --class-path mypath --summary MyClass.jar
選択肢
-
MyClass.jar
に含まれるクラスに対する全ての依存関係を要約表示する -
MyClass.jar
のJARファイルに含まれるクラスの依存関係をリスト表示する -
MyClass.jar
に依存している全てのモジュールをリスト表示する -
MyClass.jar
に含まれるモジュールの情報を要約表示する
解答
正解: 1. `MyClass.jar` に含まれるクラスに対する全ての依存関係を要約表示するjdeps --class-path mypath --summary MyClass.jar
コマンドは、指定されたJARファイルに含まれるクラスに対する全ての依存関係を要約して表示します。
問22
次のコードを実行した場合に発生する結果はどれですか?
public class SyncExample {
public void doWait() {
wait();
}
public static void main(String[] args) {
SyncExample example = new SyncExample();
example.doWait();
}
}
選択肢
- 正常に実行される
- プログラムが無限に待機する
- 実行時に
IllegalMonitorStateException
が発生する - コンパイルエラーが発生する
解答
正解: 3. 実行時に`IllegalMonitorStateException`が発生するwait()
メソッドは、synchronized
メソッドまたはブロック内でなければなりません。コードではsynchronized
を使用していないため、IllegalMonitorStateException
が発生します。
問23
次のコードを実行した場合の結果はどれですか?
import java.util.concurrent.*;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
queue.put(1);
queue.put(2);
boolean success = queue.offer(3, 2, TimeUnit.SECONDS);
System.out.println("Success: " + success);
}
}
選択肢
-
Success: true
が出力される -
Success: false
が出力される - 実行時に
IllegalStateException
が発生する - コンパイルエラーが発生する
解答
正解: 2. `Success: false` が出力されるLinkedBlockingQueue
のoffer
メソッドは、指定された時間内に要素をキューに追加できない場合にfalse
を返します。このコードでは、キューの容量がすでにいっぱいであり、2秒以内に空きができないため、queue.offer(3, 2, TimeUnit.SECONDS)
はfalse
を返し、"Success: false"が出力されます。
問24
次のコードを実行した場合の結果はどれですか?
import java.util.concurrent.*;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
try{
Integer result = queue.poll(2, TimeUnit.SECONDS);
System.out.println("Result: " + result);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
選択肢
-
Result: null
が出力される -
Result: 0
が出力される - コンパイルエラーが発生する
- 実行時に
InterruptedException
が発生する
解答
正解: 1. `Result: null`が出力されるBlockingQueue
のpoll
メソッドは2秒間待機した後、nullを戻します。
問25
import java.util.Arrays;
import java.util.List;
public class ParallelStreamReduceExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d");
String result = list.parallelStream()
.reduce("X", (s1, s2) -> s1 + s2);
System.out.println(result);
}
}
選択肢
Xabcd
XaXbXcXd
- 順序が保証されないため、結果は
Xabcd
またはXdcba
になる - コンパイルエラーが発生する
解答
正解: 2. `XaXbXcXd`parallelStream
での reduce
メソッドは、各要素に対して指定された結合関数を適用し、並列処理のため中間結果が作られます。この例では、初期値 X
が各要素に対して適用されるため、結果は XaXbXcXd
となります。
問26
import java.util.Arrays;
import java.util.List;
public class ParallelStreamReduceExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d");
String result = list.parallelStream()
.reduce("X",
(s1, s2) -> s1 + "-" + s2,
(s1, s2) -> s1 + "-" + s2);
System.out.println(result);
}
}
選択肢
Xa-Xb-Xc-Xd
Xa-b-c-d
X-a-b-c-d
XaXbXcXd
解答
正解: 1. `Xa-Xb-Xc-Xd`parallelStream
での reduce
メソッドの第3引数は、並列処理された部分結果を結合する際に使用されます。この例では、s1 + "-" + s2
によって各部分結果が -
で結合されるため、結果は Xa-Xb-Xc-Xd
となります。
問27
次のコードを実行した場合、どのような結果が得られるかを選択してください。
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ParallelStreamToConcurrentMapExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "a", "b");
Map<String, Integer> result = list.parallelStream()
.collect(Collectors.toConcurrentMap(
Function.identity(),
String::length,
(existing, replacement) -> existing + replacement));
System.out.println(result);
}
}
選択肢
{a=1, b=1}
{a=2, b=2}
{a=2, b=1}
{a=1, b=2}
解答
正解: 2. `{a=2, b=2}`Collectors.toConcurrentMap
の第3引数は、キーが衝突した場合にどのようにマージするかを指定します。この例では、同じキー ("a"
や "b"
) の場合に、既存の値と新しい値 (String::length
の結果である 1) を加算します。
問28
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("example.txt", false)) {
writer.write("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
選択肢
-
example.txt
が存在する場合、その内容が上書きされる -
example.txt
が存在する場合、内容が追加される -
example.txt
が存在しない場合、エラーが発生する - コンパイルエラーが発生する
解答
正解: 1. `example.txt` が存在する場合、その内容が上書きされるFileWriter
のコンストラクタに第二引数に false
を指定すると、ファイルが存在する場合はその内容が上書きされ、ファイルが存在しない場合は新しくファイルが作成されます。true
を指定した場合は、内容が追加されます。
問29
example.txt
ABCDEFG
HIJKLMN
OPQRSTU
1234567
89ZYXWV
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
reader.skip(3);
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
選択肢
1
OPQRSTU
1234567
89ZYXWV
2
DEFG
HIJKLMN
OPQRSTU
1234567
89ZYXWV
3
1234567
89ZYXWV
4
コンパイルエラーになる
解答
正解: 3BufferedReader
の skip
メソッドは文字単位でスキップを行います。
問30
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileDeleteExample {
public static void main(String[] args) {
File file = new File("exampleGold.txt");
Path path = Paths.get("exampleSilver.txt");
try {
file.delete();
Files.delete(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
選択肢
-
file.delete()
は成功時にtrue
を返し、失敗時にfalse
を返す。Files.delete()
は成功時に何も返さず、失敗時に例外をスローする。 -
file.delete()
は削除に成功するとfalse
を返し、Files.delete()
は成功時にtrue
を返す。 -
file.delete()
は削除に成功するとtrue
を返すが、Files.delete()
は成功時に何も返す。 -
file.delete()
は削除に成功すると何も返さず、Files.delete()
は成功時にfalse
を返す。
解答
正解: 1. `file.delete()` は成功時に `true` を返し、失敗時に `false` を返す。`Files.delete()` は成功時に何も返さず、失敗時に例外をスローする。file.delete()
は削除が成功した場合に true
を、失敗した場合に false
を返します。一方、Files.delete()
は削除成功時に戻り値がなく、失敗した場合に例外 (IOException
) をスローします。
問31
import java.util.function.IntToDoubleFunction;
public class LambdaExample {
public static void main(String[] args) {
IntToDoubleFunction f = (int i) -> { return i * 1; };
System.out.println(f.applyAsDouble(10));
}
}
選択肢
- ラムダ式の戻り値が
int
型であっても、IntToDoubleFunction
はdouble
型に自動的に変換するため、コンパイルエラーは発生しない。 - ラムダ式の戻り値が
int
型であった場合、IntToDoubleFunction
はコンパイルエラーになる。 -
IntToDoubleFunction
はint
型の引数をdouble
型の戻り値に変換するため、戻り値がint
型のラムダ式はコンパイルエラーになる。 -
IntToDoubleFunction
にint
型の戻り値を渡すと、double
型に変換されるが、コード内でint
型の戻り値を使用することはできない。
解答
正解: 1. ラムダ式の戻り値が`int`型であっても、`IntToDoubleFunction`は`double`型に自動的に変換するため、コンパイルエラーは発生しない。IntToDoubleFunction
はint
型の引数をdouble
型の戻り値に変換する関数型インターフェイスです。ラムダ式の戻り値がint
型であっても、コンパイラは自動的にdouble
型に変換してくれるため、コンパイルエラーは発生しません。戻り値がdouble
型として扱われます。