数値のラッパークラスは比較において少し予想に反した動きをするので一応注意しておく
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"); }
これはあなたの予想に反して 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 を使えば同値比較になってくれるのでこっちを使うとよい。
Long x = 1234L; if(x.equlas(1234L)){ System.out.println("aaaa"); }
プリミティブ型はそもそも equals メソッドを持っていないので書こうとした段階で IDE が教えてくれる。
結論から言うと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だよね。