何問解ける?Javaクイズ!(全13問) #techtekt Q

何問解ける?Javaクイズ! #techtektQ

みなさまこんにちは。techtekt編集部です。
パーソルキャリアのエンジニアやデータサイエンティストなどが出題する「#techtekt Q」
前回は、TypeScript編をお届けしました。

techtekt.persol-career.co.jp

第2弾は、主に転職サービス「doda」やハイクラス転職サービス「iX」などの開発の主要言語であるJavaに関するクイズをプロダクト開発統括部 佐藤 政美さんからの出題です。
さぁ、あなたは何問解けますか???

1問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz01 {
    public static void main(String[] args) {
        boolean b = true;
        if (b = false) {
            System.out.println("A");
        } else {
            System.out.println("B");
        }
    }
}

選択肢

(1)コンパイルエラーになる
(2)A が表示される
(3)B が表示される

正解 (3)B が表示される

ちょっと引っ掛けです。
b = false は、変数 b に false を代入しただけなので、falseが評価され、elseのほうに入ります。

2問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz02 {
    public static void main(String[] args) {
        int i = 2;
        switch (i) {
            case 1:
                System.out.println("A");
            case 2:
                System.out.println("B");
            case 3:
                System.out.println("C");
            default:
                System.out.println("D");
        }
    }
}

選択肢

(1)コンパイルエラーになる
(2)B が表示される
(3)B C が表示される
(4)B C D が表示される

正解 (4)B C D が表示される

break文 が書かれていないので、条件に一致したcase以下の処理が実行されてしまいます。

3問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz03 {
    public static void main(String[] args) {
        Book book = new Book();
        System.out.println(book.pageCount);
    }
}

class Book {
    public int pageCount;

    // Static Initializer
    {
        this.pageCount = 10;
    }

    // コンストラクタ
    public Book() {
        this.pageCount = 20;
    }
}

選択肢

(1)コンパイルエラーになる
(2)10 が表示される
(3)20 が表示される

正解 (3)20 が表示される

Static Initializer よりも後に コンストラクタ が実行されます。

4問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

class Parent {
    public String name = "Dragon";
}

class Child extends Parent {
    public String name = "Luffy";
}

public class Quiz04 {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println(child.name);
    }
}

選択肢

(1)コンパイルエラーになる
(2)Luffy が表示される
(3)Dragon が表示される

正解 (2)Luffy が表示される

親クラスのフィールドを継承した子クラスで再定義しています。
この場合、子クラスのフィールド定義が優先されます。

5問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz05 {
    public static void main(String[] args) {
        System.out.println(calculate(3));
    }

    private static int calculate(int i) {
        return i == 1 ? i : i + calculate(i - 1);
    }
}

選択肢

(1)コンパイルエラーになる
(2)3 が表示される
(3)5 が表示される
(4)6 が表示される

正解 (4)6 が表示される

再帰処理です。
最初は、3 + calculate(2)
次に 3 + 2 + calculate(1)
最後は、 3 + 2 + 1 で、結果は、6です。

6問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

class Box<T> {
    T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return this.value;
    }
}

public class Quiz06 {
    public static void main(String[] args) {
        Box<String> box = new Box<>();
        box.set("Blue");
        System.out.println(box.get());
    }
}

選択肢

(1)コンパイルエラーになる
(2)Blue が表示される
(3)実行時例外が発生する

正解 (2)Blue が表示される

ジェネリクスは、<>で囲まれたデータ型名をクラスやメソッドに付けることで
StringやLongなど、様々な型に対応する汎用的なクラスやメソッドを作ることができる機能です。
このコードの場合、T が String に置き換わって動作しますので、Bule が表示されます。

7問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz07 {
    public static void main(String[] args) {
        System.out.println(calculate(2));
    }

    private static int calculate(int i) {
        int j = 3;

        class LocalInner {
            public int test() {
                j = j + i;
                return j;
            }
        }
        return new LocalInner().test();
    }
}

選択肢

(1)コンパイルエラーになる
(2)5 が表示される
(3)実行時例外が発生する

正解 (1)コンパイルエラーになる

内部クラスから、これを囲うメソッドの実質finalな変数や引数の参照は可能ですが、変更できません。
このコードは、変数 j を変更しようとしているので、以下のコンパイルエラーが発生します。
java: 内部クラスから参照されるローカル変数は、finalまたは事実上のfinalである必要があります

8問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Quiz08 {
    public static void main(String[] args) {
        Map<Integer, String> map = new TreeMap<>();

        map.put(3, "Sanji");
        map.put(1, "Luffy");
        map.put(2, "Zoro");

        Set<Integer> set = map.keySet();
        Iterator<Integer> itr = set.iterator();

        while (itr.hasNext()) {
            System.out.println(map.get(itr.next()));
        }
    }
}

選択肢

(1)コンパイルエラーになる
(2)実行時例外が発生する
(3)Sanji Luffy Zoro が表示される
(4)Luffy Zoro Sanji が表示される

正解 (4)Luffy Zoro Sanji が表示される

HashMapはキーの順番を保証しないのに対し、TreeMapはキーを自動的にソートし、順序を保証します。
KeySetメソッドは、すべてのキーをSetとして返し、Iteratorはすべての要素を順番にアクセスする時に使います。

9問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

import java.util.*;

public class Quiz09 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("Luffy");
        list.add("Zoro");
        list.add("Sanji");

        for (String str : list) {
            if (Objects.equals(str, "Luffy")) {
                list.remove(str);
                continue;
            }
            System.out.println(str);
        }
    }
}

選択肢

(1)コンパイルエラーになる
(2)実行時例外が発生する
(3)Zoro Sanji が表示される
(4)Luffy Zoro Sanji が表示される

正解 (2)実行時例外が発生する

java.util.ConcurrentModificationException が発生します。
拡張for文でコレクション反復処理中に、要素の削除はしないほうがいいです。

10問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

public class Quiz10 {
    public static void main(String[] args) {
        int i1 = 1;
        Integer i2 = 2;

        System.out.println(calculate(i1, i2));
    }

    private static int calculate(int i1, int i2) {
        return i1 + i2;
    }

    private static int calculate(Integer i1, Integer i2) {
        return i1 + i2;
    }
}

選択肢

(1)コンパイルエラーになる
(2)実行時例外が発生する
(3)3 が表示される

正解 (1)コンパイルエラーになる

オートボクシングによって、2つのcalculateが同じと判断されるため、以下のコンパイルエラーになります。
calculateの参照はあいまいです
Quiz10のメソッド calculate(int,int)とQuiz10のメソッド calculate(java.lang.Integer,java.lang.Integer)の両方が一致します

11問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

import java.util.Comparator;
import java.util.stream.Stream;

class Sailor {
    private String name;
    private int height;

    public Sailor(String name, int height) {
        this.name = name;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return this.name;
    }
}

public class Quiz11 {
    public static void main(String[] args) {
        Stream<Sailor> stream = Stream.of(
                new Sailor("Robin", 188),
                new Sailor("Luffy", 174),
                new Sailor("Zoro", 181)
        );
        stream.sorted(Comparator.comparing(Sailor::getHeight))
                .forEach(System.out::println);
    }
}

選択肢

(1)コンパイルエラーになる
(2)実行時例外が発生する
(3)Robin Luffy Zoro が表示される
(4)Luffy Zoro Robin が表示される

正解 (4)Luffy Zoro Robin が表示される

streamのsortedメソッドに順序付けの基準となる身長を取得するメソッドを指定しています。
2つのコロン(::)は「メソッド参照」と言い、呼び出したいメソッドを「{クラス名}::{メソッド名}」という表記で指定できます。

12問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

class FakeFile implements AutoCloseable {
    public void read() {
        throw new RuntimeException("Failed to read the file.");
    }

    public void close() {
        System.out.println("close!");
    }
}

public class Quiz12 {
    public static void main(String[] args) {
        try (FakeFile fakeFile = new FakeFile()) {
            fakeFile.read();
        } catch (RuntimeException e) {
            System.out.println("catch!");
        }
    }
} 

選択肢

(1)コンパイルエラーになる
(2)catch! close! が表示される
(3)close! catch! が表示される

正解 (3)close! catch! が表示される

FakeFileがAutoCloseableを実装しているので
try-with-resourcesにて例外がスローされた場合は、リソースのクローズが先に実行され
その後でcatchブロックが実行されます。

13問目

次のプログラムをコンパイル&実行するとどのような結果になるでしょうか?

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class Quiz13 {
    public static void main(String[] args) {
        long epoch = 0L;
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(epoch), ZoneId.of("UTC"));
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(localDateTime.format(formatter));
    }
}

選択肢

選択肢なしです。何が表示されるでしょうか?

正解 「1970-01-01 00:00:00」 が表示される

Epoch Time(エポック時間)は、Unix Timeとも呼ばれ、コンピュータ上での時刻表現の1つです。
UTC(協定世界時)での1970年1月1日0時0分0秒を基準にして、この基準から何秒たったのかを数値にしていますので、0 は、基準の「1970年1月1日0時0分0秒」を指します。
※Javaでエポック時間を扱うときは、long型が適切です。
※エポック時間の単位は、秒で表現する場合とミリ秒で表現する場合があります。

さて、いかがでしたでしょうか。 次回の #techtektQ もお楽しみに~!

プロダクト開発統括部 エンジニアリング部 dodaエンジニアリンググループ シニアエンジニア 佐藤 政美の写真

佐藤 政美 Masami Sato

プロダクト開発統括部 エンジニアリング部 dodaエンジニアリンググループ シニアエンジニア

SIer、会計パッケージベンダーを経て、2020年7月にパーソルキャリアに入社。入社後は、dodaサイト開発に携わりつつ、AWSを活用した新たな開発に取り組んでいる。

※2022年1月現在の情報です。

▶プロダクト開発統括部の求人ページはこちらから