2016-07-24 15 views
0

私はJavaでいくつかのタイプの真のテーブルが何であるかを調べようとしていました。Javaタイプ、値の比較

私は上の方が真を返し、下が偽であることを理解できませんか?

public class CompareTypes{ 

    public static void main(String[] args){ 

     // ------------------------------------- 
     Integer AA = 12; 
     Integer BB = 12; 
     System.out.println(AA == BB); // true 

     // ------------------------------------- 
     Integer a = 128; 
     Integer b = 128; 
     System.out.println(a == b); // false 


    } 

} 

答えて

1

オートボックのアーティファクトが表示されています。

Integerオブジェクトには異なるオブジェクトIDがあります。つまり、2つの異なるIntegerオブジェクトは、==の場合、falseになります。しかし、valueOfメソッドは、Integerオブジェクトの最初の127個の値をキャッシュします。あなたが-128と+127の間にIntegerを作成すると、その静的ファクトリのvalueOfによって、まったく同じオブジェクトが得られます。値> = 128のものを作成すると、毎回完全に新しいオブジェクトが得られます。異なるIDを使用すると、==の呼び出しに直感的に反応しません。

オートボクシングは、自動ボクシングを行うために、Integerオブジェクトとして作成されたオブジェクト参照が、intリテラルが128未満の作品である理由があります。しかし、値が128の2つのIntegerオブジェクトを作成する行は、2つの異なるオブジェクトを作成します。

話の教訓

  • は文字通りの種類や箱入りタイプを混合の用心値の型
  • ため.equals()を使用しようとしています。

https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof