・オフジェクトの等値判定は==ではなくequalsを使用する.等値判定が必要なクラスにはequalsが定義してある(はず).
・Stringの等値判定を==で行っているプログラムを見ることがあるが、見ていると貧血になりそうである。一応デバッグが通っている。これが動作する理由は、代入で回していればtrueとなるから.
・Integerでも同じだが、プリミティブ(int)があるので、少しだけ複雑になる.
・常識的なことも含めて確認してみる.
・結果として注意しなければならないのはInteger同士の等値判定で==を使用した場合.等値判定の時に対象の変数がIntegerかintかを一々確認したりはしない.そして大部分では==が使われる.これは危険....
・だがしかし、両方ともIntegerであるという確率は非常に少ないと思われる.よかった、よかった.
Tips0048.java
package jp.avaj.lib.algo;
import jp.avaj.lib.test.ArTest;
import jp.avaj.lib.test.L;
public class Tips0048 {
public static void main(String[] args) {
// テストケースを開始する
ArTest.startTestCase("Tips0048");
L.p("\n==== IntegerとIntegerの等値判定");
{
Integer i0 = new Integer(5);
Integer i1 = i0;
Integer i2 = new Integer(5);
//
// これは代入なのでtrueとなる.
ArTest.isTrue("i0 vs i1","result",(i0 == i1));
// これはfalse ⇒ ★これだけが危ない
ArTest.isFalse("i0 vs i2","result",(i0 == i2));
}
L.p("\n==== Integerとintの等値判定");
{
Integer integer = new Integer(5);
int int0 = 5;
//
// equalsによる判定
ArTest.isTrue("Integer.equals(int)","result",integer.equals(int0));
// == による判定
ArTest.isTrue("Integer == int","result",integer == int0);
}
L.p("\n==== intとintの等値判定 ⇒ 省略");
//
L.p("\n==== IntegerとIntegerの大小判定");
{
Integer integer0 = new Integer(5);
Integer integer1 = new Integer(4);
ArTest.isTrue("Integer > Integer","result",integer0 > integer1);
}
L.p("\n==== Integerとintの大小判定");
{
Integer integer0 = new Integer(5);
ArTest.isTrue("Integer > int","result",integer0 > 4);
}
L.p("\n==== intとintの大小判定 ⇒ 省略");
L.p("\n==== 番外");
// これら両方ともfalse。当たり前とは言え、非常に違和感がある。
L.p((new Integer(1)).equals(new Long(1))+"");
L.p(((new Boolean(true)) == (new Boolean(true)))+"");
L.p("");
// テストケースを終了する
ArTest.endTestCase();
}
}
実行結果は次のとおり。
**** Tips0048 start ****
==== IntegerとIntegerの等値判定
OK i0 vs i1:result=true
OK i0 vs i2:result=false
==== Integerとintの等値判定
OK Integer.equals(int):result=true
OK Integer == int:result=true
==== intとintの等値判定 ⇒ 省略
==== IntegerとIntegerの大小判定
OK Integer > Integer:result=true
==== Integerとintの大小判定
OK Integer > int:result=true
==== intとintの大小判定 ⇒ 省略
==== 番外
false
false
**** Tips0048 summary ****
test count = 6
success = 6