[ Scroll down to read in English ]
こんにちは、CTO の矢崎 (@saiya_moebius) です。
只今開催中の JJUG CCC 2019 Spring というイベントで Java のクイズを配布しております。
問題文自体はシンプルですが、JVM の意外な挙動や Java の言語仕様が関わっており、実は一筋縄ではいかないクイズとなっております。
イベントでは紙で配布しているのですが、イベントに来られていない方に twitter などでシェアしたいというお声をいただきましたので、こちらの blog でも問題文を共有いたします。イベントへの来場に関係なく楽しんでいただける Quiz になっているかと思いますので、ぜひ考えてみていただければと思います。
M3 Java Quiz (2019 Spring)
以下が JJUG 会場で頒布いたしております Quiz ペーパーの内容です (再掲載)。初見の方は、ぜひ以下を見ながら考えてみてください。
環境は 64bit 環境の OpenJDK 11 で特に JVM オプションを付けない状態を想定します。
Q1: String のインスタンス
public static final String A = "hoge"; public static final String B = "hoge";
のときに、以下それぞれで A == B
は true
/ false
どちらでしょうか:
- A と B が同じ .class ファイルにある
- A と B が異なる class, 同じ jar にある
- A と B が異なる jar, 同じ ClassLoader にある
- A と B が異なる ClassLoader にある
Q2: Integer のインスタンス
return (Integer)(new Random().nextInt(100)); // Integer 型を返すメソッド
100,000 回実行すると、上記コードが Integer 型のインスタンスをいくつ新規作成するでしょうか:
- 0 個
- 1〜100 個
- 256 個 (-128 から +127 の整数)
- 100,000 個
※インライン化などの最適化で int → Integer の型変換が消えることはない前提とします
Q3: Exception のインスタンス - その 1
String str = null; str.length(); // NullPointerException (NPE) が発生する
100,000 回実行すると、上記コードが NPE のインスタンスをいくつ新規作成するでしょうか:
- 0 個
- 1 個
- 2〜99,999 個
- 100,000 個
Q4: Exception のインスタンス - その 2
throw new UnauthorizedException("ログインが必要です");
100,000 回実行すると、上記コードが例外のインスタンスをいくつ新規作成するでしょうか:
- 0 個
- 1 個
- 2〜99,999 個
- 100,000 個
以上が今回の Quiz です。
普通に JVM を利用している限りあまり意識しない挙動だと思いますが、 パフォーマンスを考える上で気になる点ではないでしょうか。
解答と解説
05/20 追記: Java Quiz 解答・解説 - エムスリーテックブログ に解説記事を掲載いたしました。
解説記事を後日この blog にアップロードいたしますので、以下の twitter のフォローよろしくお願いいたします。解説記事の投稿時にお知らせいたします:
English version
Hi. I am Seiya Yazaki (@saiya_moebius), CTO of Japan M3, Inc.
We distributed a printout of Java Quiz in the event JJUG CCC 2019 Spring.
It is a simple but deep quiz. Background of the quiz is based on interesting JVM behavior and/or Java language specification.
Today I translated the quiz for English friends, please enjoy this quiz!
M3 Java Quiz (2019 Spring)
Environment for this quiz is OpenJDK 11 in 64bit without any JVM option.
Q1: String instance(s)
public static final String A = "hoge"; public static final String B = "hoge";
In each of the following cases, does A == B
is true
? Or false
?
- Constant
A
andB
are placed in same class - Constant
A
andB
are placed in different class, but in same jar - Constant
A
andB
are placed in different jar, but in same ClassLoader - Constant
A
andB
are placed in different ClassLoader
Q2: Integer instance(s)
return (Integer)(new Random().nextInt(100)); // Method that returns Integer
If we call above code 100,000 times, how many Integer
instance(s) does this code creates?
- 0 instance
- 1〜100 instance(s)
- 256 instances (From -128 to +127)
- 100,000 instances
Note: In this question, please assume that JIT does NOT remove int→Integer type conversion
Q3: Exception instance(s) - 1
String str = null; str.length(); // throws NullPointerException (NPE)
If we call above code 100,000 times, how many NPE instance(s) does this code creates?
- 0 instance
- 1 instance
- 2〜99,999 instances
- 100,000 instances
Q4: Exception instance(s) - 2
throw new UnauthorizedException("You need to login");
If we call above code 100,000 times, how many exception instance(s) does this code creates?
- 0 instance
- 1 instance
- 2〜99,999 instances
- 100,000 instances
Please enjoy this quiz!