Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

Java Gold 例題 総合

Last updated at Posted at 2024-08-29

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

選択肢

  1. このコードは正常にコンパイルされ、"default" と "default description" が出力される
  2. このコードはコンパイルエラーになる。アノテーションのメンバにはデフォルト値を指定できない
  3. このコードはコンパイルエラーになる。アノテーションのメンバに new によるインスタンス化式をデフォルト値として使用できない
  4. このコードは実行時エラーが発生する
解答 正解: 3. このコードはコンパイルエラーになる。アノテーションのメンバに `new` によるインスタンス化式をデフォルト値として使用できない

解説:
アノテーションのメンバにはデフォルト値を指定できますが、そのデフォルト値として使用できるのは定数(プリミティブ型、StringEnumClass など)に限られます。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();
    }
}

選択肢

  1. このコードは正常にコンパイルされ、"SubClass method" が出力される
  2. このコードはコンパイルエラーになる。SubClassmethodthrows Exception を指定する必要がある
  3. このコードは正常にコンパイルされ、"SuperClass method" が出力される
  4. このコードは実行時エラーになる
解答 正解: 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();
        }
    }
}

選択肢

  1. file.txtの内容がすべて出力される
  2. コンパイルエラーになる
  3. file.txtの内容が一行だけ出力される
  4. 実行時エラーになる可能性がある
解答 正解: 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();
    }
}

選択肢

  1. 30, 20, 10 が順に表示される
  2. 10, 20, 30 が順に表示される
  3. コンパイルエラーが発生する
  4. 実行時エラーが発生する
解答 正解: 1. `30`, `20`, `10` が順に表示される

解説:
コードでは、3つの異なるスコープに同じ名前の変数 num が定義されています。それぞれのスコープは以下のように解釈されます:

  1. numdisplay メソッド内のローカル変数(30)。
  2. Inner.this.numInner クラスのメンバ変数(20)。
  3. Outer.this.numOuter クラスのメンバ変数(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());
    }
}

選択肢

  1. peek()element() は "One" を返し、poll() は "One" を削除し、remove()null を削除し、再度 peek() は "Two" を返す
  2. peek()element() は "One" を返し、poll() は "One" を削除し、remove() は "Two" を削除し、再度 peek()null を返す
  3. peek()element() は "One" を返し、poll() は "One" を削除し、remove()null を削除し、再度 peek()null を返す
  4. 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();
        }
    }
}

選択肢

  1. SQLException がスローされる
  2. name にはデータベースの最初のレコードの値が設定される
  3. name には null が設定される
  4. name には空文字が設定される
解答 正解: 1. `SQLException` がスローされる

ResultSetnext() メソッドを呼ばずに 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);
    }
}

選択肢

  1. int 型の引数を getObject() メソッドに渡すことができます。
  2. int 型の引数は getObject() メソッドに渡すことはできません。
  3. int 型の引数を渡す場合、戻り値は int 型になります。
  4. int 型の引数を渡すと、ResourceBundle に存在しないキーとして扱われます。
解答 正解: 2. `int` 型の引数は `getObject()` メソッドに渡すことはできません。

ResourceBundlegetObject() メソッドには、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);
        }
    }
}

選択肢

  1. element() メソッドは null を返し、remove() メソッドは NoSuchElementException をスローする
  2. element() メソッドは NoSuchElementException をスローし、remove() メソッドは NoSuchElementException をスローする
  3. element() メソッドは NoSuchElementException をスローし、remove() メソッドは null を返す
  4. 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(); 
    }
}

選択肢

  1. ジェネリクスを用いた static メソッドはコンパイルエラーになる
  2. static メソッドはジェネリクスを用いることができるが、クラスのインスタンスを生成する必要がある
  3. static メソッドにジェネリクスは使えないが、インスタンスメソッドには使える
  4. 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");
    }
}

選択肢

  1. static メソッド printValue はジェネリクスを使用することができ、型パラメータ T をメソッドの引数に指定できる
  2. static メソッド printValue にはジェネリクスを使用することができるが、型パラメータ T はクラスのインスタンスを介してしか使用できない
  3. static メソッド printValue にはジェネリクスを使用することができず、型パラメータはクラスレベルでのみ定義される
  4. 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);
    }
}

選択肢

  1. reverseOrder()は逆順でソートし、reversed()は元の順序に戻す。
  2. reverseOrder()はComparatorを返し、reversed()はそのComparatorの順序を反転する。
  3. reverseOrder()はComparatorを返し、reversed()はリストを逆順にソートする。
  4. 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));
    }
}

選択肢

  1. IntToDoubleFunctionint型の引数を受け取るため、Integer型の引数を渡すとコンパイルエラーになる。
  2. IntToDoubleFunctionInteger型の引数を受け取るため、int型の引数を渡すとコンパイルエラーになる。
  3. IntToDoubleFunctionint型の引数をInteger型の引数に自動的に変換するため、コンパイルエラーは発生しない。
  4. IntToDoubleFunctionInteger型の引数を受け取るため、int型の引数を渡すとコンパイルエラーになる。
解答 正解: 1. `IntToDoubleFunction`は`int`型の引数を受け取るため、`Integer`型の引数を渡すとコンパイルエラーになる。

IntToDoubleFunctionint型の引数を受け取る関数型インターフェイスです。そのため、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();
        }
    }
}

選択肢

  1. Data found!
  2. No data found.
  3. 実行時に例外が出る
  4. 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());
            }
        }
    }
}

選択肢

  1. コードはコンパイルエラーになる。e.addSuppressed(suppressed); の行でエラーが発生する
  2. コードは正常にコンパイルされ、e.getSuppressed() メソッドで抑制された例外を取得できる
  3. コードはコンパイルエラーになる。suppressed 変数が catch ブロック外で使用されているためエラーが発生する
  4. コードは正常にコンパイルされるが、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));
    }
}

選択肢

  1. isNotPositive.test(5)falseisNotPositive.test(-3)trueisNotPositive.test(0)false を出力する。
  2. isNotPositive.test(5)trueisNotPositive.test(-3)falseisNotPositive.test(0)true を出力する。
  3. isNotPositive.test(5)falseisNotPositive.test(-3)trueisNotPositive.test(0)true を出力する。
  4. isNotPositive.test(5)trueisNotPositive.test(-3)trueisNotPositive.test(0)false を出力する。
解答 正解: 3. `isNotPositive.test(5)` は `false`、`isNotPositive.test(-3)` は `true`、`isNotPositive.test(0)` は `true` を出力する。

negateメソッドは、元のPredicateの条件を反転させた新しいPredicateを生成します。元のPredicatex > 0 の場合、negateされたPredicatex <= 0 となります。したがって、isNotPositive.test(5)falseisNotPositive.test(-3)trueisNotPositive.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;
        }
    }
}

選択肢

  1. このコードは正常にコンパイルされる
  2. @TypeUseAnnotation は配列の宣言部分に適用できないため、コンパイルエラーが発生する
  3. @TypeUseAnnotation はローカル変数 testString に適用できないため、コンパイルエラーが発生する
  4. @TypeUseAnnotationElementType.TYPE_USE ではなく ElementType.LOCAL_VARIABLE を使用すべきため、コンパイルエラーが発生する
解答 正解: 1. このコードは正常にコンパイルされる

解説:
@TypeUseAnnotationElementType.TYPE_USE が指定されているため、型の使用箇所に適用できます。これには、変数の型や配列の要素の型、ジェネリック型の指定などが含まれます。このため、testStringtestArray の宣言部分にアノテーションを適用しても正常にコンパイルされます。

問17

public class Test {
    public void method() {
        final class LocalClass1 {}
        private class LocalClass2 {}
        protected class LocalClass3 {}
        abstract class LocalClass4 {}
    }
}

選択肢

  1. このコードは正常にコンパイルされる
  2. final 修飾子を持つローカルクラスはコンパイルエラーになる
  3. private 修飾子を持つローカルクラスはコンパイルエラーになる
  4. abstract 修飾子を持つローカルクラスはコンパイルエラーになる
解答 正解: 3. `private` 修飾子を持つローカルクラスはコンパイルエラーになる

解説:
ローカルクラスにはアクセス修飾子(public, private, protected)を付けることはできません。finalabstract 修飾子はローカルクラスに使用できます。このため、private class LocalClass2protected 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);
    }
}

選択肢

  1. 13579 を出力する。
  2. 13579 と出力した後に 10 を出力する。
  3. 13579 を出力し、最後に 10 を出力する。
  4. コンパイルエラーになる
解答 正解: 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);
    }
}

選択肢

  1. コンパイルエラーになる
  2. 4 が出力される
  3. 0 が出力される
  4. 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);
    }
}

選択肢

  1. 15 を出力する
  2. コンパイルエラーになる
  3. 実行時エラーが発生する
  4. 0 を出力する
解答 正解: 2. コンパイルエラーになる

IntStream.reduce() メソッドでは、引数に IntBinaryOperator を指定する必要があります。BinaryOperator<Integer>IntStream ではなく、Stream<Integer> 用の演算子であるため、コンパイルエラーが発生します。IntStream 用には IntBinaryOperator を使用する必要があります。

問21

次のコマンドがjdepsに関する正しい使い方であるのはどれですか?

jdeps --class-path mypath --summary MyClass.jar

選択肢

  1. MyClass.jar に含まれるクラスに対する全ての依存関係を要約表示する
  2. MyClass.jar のJARファイルに含まれるクラスの依存関係をリスト表示する
  3. MyClass.jar に依存している全てのモジュールをリスト表示する
  4. 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();
    }
}

選択肢

  1. 正常に実行される
  2. プログラムが無限に待機する
  3. 実行時にIllegalMonitorStateExceptionが発生する
  4. コンパイルエラーが発生する
解答 正解: 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);
    }
}

選択肢

  1. Success: true が出力される
  2. Success: false が出力される
  3. 実行時にIllegalStateExceptionが発生する
  4. コンパイルエラーが発生する
解答 正解: 2. `Success: false` が出力される

LinkedBlockingQueueofferメソッドは、指定された時間内に要素をキューに追加できない場合に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();
		}
    }
}

選択肢

  1. Result: null が出力される
  2. Result: 0 が出力される
  3. コンパイルエラーが発生する
  4. 実行時にInterruptedExceptionが発生する
解答 正解: 1. `Result: null`が出力される

BlockingQueuepollメソッドは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);
    }
}

選択肢

  1. Xabcd
  2. XaXbXcXd
  3. 順序が保証されないため、結果は Xabcd または Xdcba になる
  4. コンパイルエラーが発生する
解答 正解: 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);
    }
}

選択肢

  1. Xa-Xb-Xc-Xd
  2. Xa-b-c-d
  3. X-a-b-c-d
  4. 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);
    }
}

選択肢

  1. {a=1, b=1}
  2. {a=2, b=2}
  3. {a=2, b=1}
  4. {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();
        }
    }
}

選択肢

  1. example.txt が存在する場合、その内容が上書きされる
  2. example.txt が存在する場合、内容が追加される
  3. example.txt が存在しない場合、エラーが発生する
  4. コンパイルエラーが発生する
解答 正解: 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
コンパイルエラーになる

解答 正解: 3

BufferedReaderskip メソッドは文字単位でスキップを行います。

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

選択肢

  1. file.delete() は成功時に true を返し、失敗時に false を返す。Files.delete() は成功時に何も返さず、失敗時に例外をスローする。
  2. file.delete() は削除に成功すると false を返し、Files.delete() は成功時に true を返す。
  3. file.delete() は削除に成功すると true を返すが、Files.delete() は成功時に何も返す。
  4. 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));
    }
}

選択肢

  1. ラムダ式の戻り値がint型であっても、IntToDoubleFunctiondouble型に自動的に変換するため、コンパイルエラーは発生しない。
  2. ラムダ式の戻り値がint型であった場合、IntToDoubleFunctionはコンパイルエラーになる。
  3. IntToDoubleFunctionint型の引数をdouble型の戻り値に変換するため、戻り値がint型のラムダ式はコンパイルエラーになる。
  4. IntToDoubleFunctionint型の戻り値を渡すと、double型に変換されるが、コード内でint型の戻り値を使用することはできない。
解答 正解: 1. ラムダ式の戻り値が`int`型であっても、`IntToDoubleFunction`は`double`型に自動的に変換するため、コンパイルエラーは発生しない。

IntToDoubleFunctionint型の引数をdouble型の戻り値に変換する関数型インターフェイスです。ラムダ式の戻り値がint型であっても、コンパイラは自動的にdouble型に変換してくれるため、コンパイルエラーは発生しません。戻り値がdouble型として扱われます。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?