読者です 読者をやめる 読者になる 読者になる

Integerを"=="で比較してはいけない

追記:Javaの話です。

public class Main {
    public static void main(String args[]) throws Exception {
        Integer i1 = 1;
        Integer i2 = get1();
        if (i1 == i2) {
            System.out.println("equal");
        } else {
            System.out.println("not equal!!");
        }
    }
    public static Integer get1() {
        // DBとかから取ってきたつもり
        return new Integer(1);
    }
}

は、"not equal!!"と言われてしまいます。
(ただし、コンパイラや実行環境に依存するかもしれません。)

Integerはプリミティブ型ではないので、==では、同一のインスタンスかどうかを確認してしまっているんですね。(たぶん

普通、比較といえば、値の同一性を知りたいと思うので、

public class Main {
    public static void main(String args[]) throws Exception {
        Integer i1 = 1;
        Integer i2 = get1();
        if (i1.equals(i2)) { // ←ここを変えた
            System.out.println("equal!!");
        } else {
            System.out.println("not equal!!");
        }
    }
    public static Integer get1() {
        // DBとかから取ってきたつもり
        return new Integer(1);
    }
}

まぁ、こうしますよね。

ただ、上記の場合は i1がnullの場合はNullPointerExceptionが発生します。当たり前ですね。
なので、 i1 が必ずnullでは無い場合にしか使えないです。
nullの場合、一致とみなすか、不一致とみなすかは文脈によるかと思いますので、割愛します。
org.apache.commons.lang.ObjectUtils.equals を利用するのも手ですね。

8/10追記 java.util.Objects.equals ってのがJava7からあるみたいです。(コメントで教えていただきました。)

ちゃんと考えれば当たり前なんですが、誰かの書いたコードで、ぼんやり読んでるとハマりますね。(というか、ハマりました。