Java/数値ラッパークラスの比較の挙動

Java/数値ラッパークラスの比較の挙動

数値のラッパークラスは比較において少し予想に反した動きをするので一応注意しておく

バージョンと製造年月日

  • 2011-02-23
  • Java1.6

いきなりまとめ

equals 使っとけ

リテラル同士の直接比較

当たり前に true になる

if(1234L == 1234L){
    System.out.println("aaaa");
}

プリミティブ型の変数とリテラル比較

当たり前に true になる

long x = 1234L;
if(x == 1234L){
    System.out.println("aaaa");
}

プリミティブ型の変数同士の比較

当たり前に true になる

long x = 1234L;
long y = 1234L;
if(x == y){
    System.out.println("aaaa");
}

ラッパークラスとリテラルの比較

true である。

Long x = 1234L;
if(x == 1234L){
    System.out.println("aaaa");
}

ラッパークラスとプリミティブ変数の比較

true である。

Long x = 1234L;
long y = 1234L;
if(x == y){
    System.out.println("aaaa");
}

ラッパークラス同士の比較(大値)

これはあなたの予想に反して false になるのである

Long x = 1234L;
Long y = 1234L;
if(x == y){
    System.out.println("aaaa");
}

つまりこれ、同値であるが同一では無いと判断されているのである。この String の例と同じである。

if(new String("aaabbb") == new String("aaabbb")){
    System.out.println("aaaa");
}

ラッパークラス同士の比較(小値)

上記の挙動から、ラッパークラス同士は false なのねと思っていたら、値が小さくなると これはあなたの予想に反して true になるのである

Long x = 123L;
Long y = 123L;
if(x == y){
    System.out.println("aaaa");
}

これは、Java が -127 から 127 までを特別な数値として実装されているからのようだ。

この数値を 128 以上に設定すると結果は false になる。

これは equals で比較しないといけない String がこの例では == 演算子で true になってしまう挙動と似ている。

if("aaabbb" == "aaabbb"){
    System.out.println("aaaa");
}

ジェネリクスで定義されたラッパークラスの型同士の比較

ラッパークラスなんか使わなければよいという話になるのだが、避けて通れないのが List<Long> みたいなやつ。 こいつの挙動を調べると。

結果はバッチリ false になる

List<Long> aList = new ArrayList<>();
aList.add(1123L);
aList.add(1123L);
if(aList.get(0) == aList.get(1)){
    System.out.println("aaaa");
}

equals を使う

equals を使えば同値比較になってくれるのでこっちを使うとよい。

Long x = 1234L;
if(x.equlas(1234L)){
    System.out.println("aaaa");
}

プリミティブ型はそもそも equals メソッドを持っていないので書こうとした段階で IDE が教えてくれる。

equalsで比較しておけば安心

結論から言うとequalsで比較しておけば安心。

Long a = new Long(1L);
Long b = new Long(1L);
long c = 1L;
 
if(a.equals(b)){
    //こっち通る
    System.out.println("eq");
}else{
    System.out.println("neq");
}
 
if(a == b){
    System.out.println("eq");
}else{
    //こっち通る
    System.out.println("neq");
}
  • ラッパー同士ならばequalsで比較すると同値比較ができる
  • ラッパー同士の比較演算子での比較は同一比較になって同じ値でも真にならない
  • ラッパーとプリミティブならば引数のプリミティブがオートボクシングでインスタンス化されるので同値比較になる
  • プリミティブ型はequalsメソッドが使えない

ってことでequalsだよね。

java/compare_behavior_wrapper_class.txt · 最終更新: 2018-05-04 11:31 by ore