Javaってなんて難しい言語なんだろう

// jdk5以上でコンパイルするんじゃ!
class a
{
  public static void main(String[] args)
  {
    // auto boxing
    Integer k1 = 20;
    Integer k2 = 20;
   
    Integer h1 = 200;
    Integer h2 = 200;

    // 値じゃなくてオブジェクトの比較
    if(k1 == k2)
        System.out.println("k1 は k2 同じモンかしら!");
    else
        System.out.println("k1 は k2 別モンかしら!");
   
    if(h1 == h2)
        System.out.println("h1 は h2 同じおぶじぇくとなのよー");
    else
        System.out.println("h1 は h2 違うおぶじぇくとなのよー");
  }
}

実行結果


k1 は k2 同じモンかしら!
h1 は h2 違うおぶじぇくとなのよー



ええええええ!?



手元にある SJC-P の参考書 には次のように書いてあります。

言語使用では、値を autoboxing によりオブジェクトに変換した場合、ある範囲の値であれば同じオブジェクト参照を変えるように規定されています。

  • boolean 型と byte 型は、同じ値に対して同じオブジェクト参照を返す
  • char 型は、\u0000 から \u007F の範囲で同じオブジェクトを返す
  • int 型と short 型は、-128 から 127 の範囲で同じオブジェクト参照を返す


どういう理由でSUNはこんな仕様にしたんだろう…