オブジェクトの比較演算子

Java

プリミティブ型の値が等値かどうかを判定するには、演算子 ==, != を使う。

参照型が等値かどうかを判定するには、メソッド equals を使う。

参照型に対して演算子 ==, != を使うと、それは等値かどうかではなく、同じインスタンスを指しているかどうかの判定になる。

if (obj1.equals(obj2)) {
    ...;
}

ただし、equalsはクラスごとにequalsが適切に実装されている必要がある。

プリミティブ型をボクシングした参照型と対応するプリミティブ型を == で比較した場合は、プリミティブ型として等値か等値かどうかを判定する。

if (Boolean.FALSE == false) {
    // OK
}

if (Integer.valueOf(1000000) == 1000000) {
    // OK
}

Javaにおける == はRubyにおける equal? に似ていて、 Javaにおける equals はRubyにおける == に似ている。

Scala

== は等値の場合に true を返す。 != はその反対。 == はJVM上では、プリミティブ型に対してはJavaと同じで、参照型に対してはJavaの equals を呼び出している。

== の左右の型が違っていて false にしかなりえない、とコンパイラが判断できる場合はコンパイル時に警告を出してくれる。例えば IntBoolean を比較しようとすると、 comparing values of types Boolean and Int using ==’ will always yield false` と出てくる。(Scala 2.10.2 で確認)

Groovy

== は等値の場合に true を返す。 != はその反対。 == はJVM上ではJavaの equals を呼び出している。

Python

等値かどうかの判定には演算子 ==, != を使う。Python2では <>!= と同じ意味で使えたが Python3では使えない。

同じインスタンスかどうかの判定には演算子 is, is not を使う。

比較演算子 | Python 2.7 documentation
http://docs.python.jp/2/reference/expressions.html#comparison

比較演算子 | Python 3 documentation
http://docs.python.jp/3/reference/expressions.html#not-in

Ruby

同じかどうかを調べる似た様なメソッドとして以下がある。

普通に等値かどうかを調べたいときには == を使う。 == は等値の場合に true を返す。 != はその反対を返す。

equal?メソッドは等値かどうかよりも範囲が狭く、同じインスタンスかどうかを判別する。

Rubyにおける == はJavaにおける equals に似ていて、 Rubyにおける equal? はJavaにおける == に似ている。

===case文when節にマッチするかどうかの判定に暗黙的に使われる。

Perl

eq は文字列として等値の場合に '1' を返し、そうでない場合は、 '' を返す。 ne はその反対。

== は数値として等値の場合に '1' を返し、そうでない場合は、 '' を返す。 != はその反対。

'10a' == '10b' は無理やり数値にして、同じ 10 になるため、1 を返す。ただ、 use warnings; を使っていると、警告を表示してくれる。

スカラーレファレンスの参照先が同じインスタンスかどうかを判定するには、 $ref1 == $ref2 のように、演算子 ==, =~ を使う。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク