JAvaにおけるintとIntegerの違い

6532 ワード

1、Integerはintのパッケージクラスであり、intはjavaの基本データ型である2、Integer変数はインスタンス化してから使用しなければならないが、int変数は3、Integerは実際にオブジェクトの参照であり、newがIntegerである場合、実際にはポインタを生成してこのオブジェクトを指す.一方、intはデータ値4、Integerを直接格納するデフォルト値null、intのデフォルト値0
延長:Integerとintの比較1、Integer変数は実際には1つのIntegerオブジェクトへの参照であるため、newによって生成された2つのInteger変数は永遠に等しくない(newによって生成されたのは2つのオブジェクトであり、メモリアドレスが異なるため).
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

2、Integer変数とint変数を比較する場合、2つの変数の値が等しい限り、結果はtrue(パッケージクラスIntegerと基本データ型intを比較するとjavaが自動的にintに分解して比較するため、実際には2つのint変数の比較になる)
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

3、new以外で生成されたInteger変数とnew Integer()で生成された変数を比較するとfalseとなります.(1変数値が-128~127の場合、非newで生成されたInteger変数はjava定数プール内のオブジェクトを指し、new Integer()で生成された変数はスタック内の新規オブジェクトを指し、両者はメモリ内のアドレスが異なる;2変数値が-128~127の場合、非newでInteger変数を生成する場合、java APIでは最終的にnew Integer(i)に従って処理される(以下第4条参照)最終2つのIntergerのアドレスは同じではない)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

4、2つの非newで生成されたIntegerオブジェクトを比較する場合、2つの変数の値が区間-128から127の間にある場合、比較結果はtrueであり、2つの変数の値がこの区間にない場合、比較結果はfalseである
Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

第4条の理由について:javaはInteger i=100をコンパイルする時、Integer i=Integer.valueOf(100)に翻訳する;java APIの中でIntegerタイプのvalueOfに対する定義は以下の通りである:
public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

JAvaは-128から127までの数に対してキャッシュを行い、Integer i=127の場合は127をキャッシュし、次回Integer j=127と書くとそのままキャッシュから取り出され、newしなくなります