基本型の変数を、比較演算子を用いて比較してみます。用意する変数は 3つ、イメージにすると以下のような感じです。
ソースコードは以下の通り。
H401/H401.java
/** * 基本型変数を比較します。 */ public class H401 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int a = 10; int b = 10; int c = 20; // a と bの比較 if(a == b) { System.out.println("aと bは等しい。"); } else { System.out.println("aと bは等しくない。"); } // a と cの比較 if(a == c) { System.out.println("aと cは等しい。"); } else { System.out.println("aと cは等しくない。"); } } }
実行結果は以下の通り。
aと bは等しい。 aと cは等しくない。
妥当な結果ですね。基本型の比較判定は話が簡単です。
参照型変数 4個とインスタンス 3個を用いて、以下の構造を実現したとします。
この場合、参照型変数の比較(一致判定)には、 2つの考え方が存在できることが分かるかと思います。
それぞれについて、サンプルプログラムをまじえて見ていきましょう。
比較演算子「==」を利用して、参照型変数を比較してみます。
ソースコードは以下の通り。
H402/H402.java
import java.awt.Point; /** * 参照型変数を == 演算子で比較します。 */ public class H402 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { Point p = new Point(100, 200); Point q = p; Point r = new Point(100, 200); Point s = new Point(150, -10); // pと qの比較 if(p == q) { System.out.println("pと qの参照先は等しい。"); } else { System.out.println("pと qの参照先は等しくない。"); } // pと rの比較 if(p == r) { System.out.println("pと rの参照先は等しい。"); } else { System.out.println("pと rの参照先は等しくない。"); } // pと sの比較 if(p == s) { System.out.println("pと sの参照先は等しい。"); } else { System.out.println("pと sの参照先は等しくない。"); } } }
実行結果は以下の通り。
pと qの参照先は等しい。 pと rの参照先は等しくない。 pと sの参照先は等しくない。
比較演算子「==」では、pと rは等しくないと判定されることに注目です。ひとことで言えば、比較演算子「==」は、参照型変数が同じインスタンスを参照しているかどうかを判定します。
Point型を含むすべての型のインスタンスに存在する equalsメソッドを利用して比較をしてみます。
ソースコードは以下の通り。
H403/H403.java
import java.awt.Point; /** * 参照型変数の参照先インスタンスを equalsメソッドで比較します。 */ public class H403 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { Point p = new Point(100, 200); Point q = p; Point r = new Point(100, 200); Point s = new Point(150, -10); // pと qの比較 if(p.equals(q)) { System.out.println("pと qの参照先インスタンスの内容は同じだ。"); } else { System.out.println("pと qの参照先インスタンスの内容は異なる。"); } // pと rの比較 if(p.equals(r)) { System.out.println("pと rの参照先インスタンスの内容は同じだ。"); } else { System.out.println("pと rの参照先インスタンスの内容は異なる。"); } // pと sの比較 if(p.equals(s)) { System.out.println("pと sの参照先インスタンスの内容は同じだ。"); } else { System.out.println("pと sの参照先インスタンスの内容は異なる。"); } } }
実行結果は以下の通り。
pと qの参照先インスタンスの内容は同じだ。 pと rの参照先インスタンスの内容は同じだ。 pと sの参照先インスタンスの内容は異なる。
equalsメソッドを使用した場合、pと rが同じだと判定されることに注目です。ひとことで言えば、equalsメソッドは、参照先インスタンスの内容が一致するかどうかを判定します。
参照型の比較については 2つ並べましたが、実際のところ、参照型の比較においては equalsメソッドで比較することがほとんどです。なので、「基本型の一致判定は == で、参照型の比較は equalsメソッドで」と割り切って覚えてしまっても構いません。
equalsメソッドは以下のような形で使用します。
if(p.equals(q)) { // 処理 }
注意する必要があるのは、equalsメソッドは、pの参照先インスタンスのインスタンスメソッドであるという点です。もし pが nullであれば、参照先インスタンスは存在しないということになります。そのため equalsメソッドを呼び出そうとするとNullPointerExceptionが発生します。
これを回避するためには、逆にq.equals(p)
と記述したり、あるいは nullの場合を除外して判定したりします(具体的には以下のような感じ)。
if(p != null && p.equals(q)) { // 処理 }