ではお待ちかねの回答を紹介します。まずは問題とプログラムをおさらいしておきましょう。
何が印刷されるでしょうか?
次のプログラムを実行するとなにが印刷されるでしょうか? 答えとその理由をお考えください。
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 となります。
Posted by とおりすがり on 2月月 14日, 2007年 at 04:07 午後 JST #
Posted by おかざき on 2月月 14日, 2007年 at 04:10 午後 JST #