基本型の比較と参照型の比較

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


基本型の比較

基本型の変数を、比較演算子を用いて比較してみます。用意する変数は 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つの考え方が存在できることが分かるかと思います。

  • 参照先が同一のインスタンスであれば一致とする考え方(pと qは等しいが、pと rは等しくない)。
  • 参照先が同一インスタンスでなくとも、インスタンスの内容が同一ならば一致とする考え方(pと rも等しい)。

それぞれについて、サンプルプログラムをまじえて見ていきましょう。

比較演算子「==」

比較演算子「==」を利用して、参照型変数を比較してみます。

ソースコードは以下の通り。

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は等しくないと判定されることに注目です。ひとことで言えば、比較演算子「==」は、参照型変数が同じインスタンスを参照しているかどうかを判定します。

比較メソッド「equals」

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メソッドは、参照先インスタンスの内容が一致するかどうかを判定します。

比較演算子と equalsメソッドの使い分け

参照型の比較については 2つ並べましたが、実際のところ、参照型の比較においては equalsメソッドで比較することがほとんどです。なので、「基本型の一致判定は == で、参照型の比較は equalsメソッドで」と割り切って覚えてしまっても構いません。

equalsメソッドと null

equalsメソッドは以下のような形で使用します。

	if(p.equals(q)) {
		// 処理
	}

注意する必要があるのは、equalsメソッドは、pの参照先インスタンスのインスタンスメソッドであるという点です。もし pが nullであれば、参照先インスタンスは存在しないということになります。そのため equalsメソッドを呼び出そうとするとNullPointerExceptionが発生します。

これを回避するためには、逆にq.equals(p)と記述したり、あるいは nullの場合を除外して判定したりします(具体的には以下のような感じ)。

	if(p != null && p.equals(q)) {
		// 処理
	}
最終更新: 2013/02/07 , 公開: 2013/02/07
▲top