Javaエバンジェリストがお届けするホットな話題
5分でわかる今週のJava ホットトピック
水曜日 2 14, 2007
先週のJavaクイズ(1) 回答編:何が印刷されるでしょうか?
ではお待ちかねの回答を紹介します。まずは問題とプログラムをおさらいしておきましょう。

何が印刷されるでしょうか?

次のプログラムを実行するとなにが印刷されるでしょうか?  答えとその理由をお考えください。

import java.util.*;

public class Equality {
public static void main(String args[]) {
Map<Short, Short> map = new HashMap<Short, Short>();
for (Short i = 0; i < 365; i++)
map.put(i, i);

for (Short i = 0; i < 365; i++) {
if (map.get(i) != i) {
System.out.println(i);
System.exit(0);
}
}
}
}

回答

答えは128です。なぜ?と思われた方も多いかもしれません。まず、一番直感的に答えを考えるならば「何も出力されない」が答えになると推測できます。しかしよく注目してください。ここで、i や mapの中に格納されている変数は java.lang.Short 型であり、 != や == で比較する場合には値ではなく参照を比較していることになります。つまり、この比較は本来は

!map.get(i).equals(i)

のように書かなければならなかったのです。ではそれをふまえて考えると、答えは「0」であるという風に判断できます。しかしこれも実は違うのです。ここから先は通常知らなくともあまり差し障りは無いのですが、すこしマニアックな引っかけ問題になっていました。

Java言語仕様第3版 5.1.7 Boxing Conversionによると

If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

このようにJava言語仕様によると、-128から127の間の数字に関しては常に参照も等しいようにすることが決められています。ですから、127を超える最初の数字 128 の参照は等しくならず、印刷されるのは 128 となります。


投稿されたコメント:

その下の Discussion に、
For other values, this formulation disallows any assumptions about the identity of the boxed values on the programmer's part.
という記述があるので、 言語規定だけから導かれる正解は「128~364の何れかの数字が印刷されるか、もしくは何も印刷されない」のようになるのではないかと思います。「128が印刷される」は実装依存な正解になってしまうかもしれません。

Posted by とおりすがり on 2月月 14日, 2007年 at 04:07 午後 JST #

おっしゃる通りですね、失礼いたしました。

Posted by おかざき on 2月月 14日, 2007年 at 04:10 午後 JST #

コメント
コメントは無効になっています。
過去の記事
« 11月 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
       
今日
Click me to subscribeこのブログを購読する(RSS)
検索

リンク
 

Today's Page Hits: 7