Javaに関する様々な情報をご紹介します。

2比較演算子

Javaに関する様々な情報をご紹介します。

比較演算子

このページでは、Javaで用意されている>>=などの比較演算子について説明します。

概要

比較演算子には以下の演算子が用意されています。

演算子 記入例 説明
> x > y xがyよりも大きい場合にtrueを返す。
>= x >= y xがyよりも大きいか等しい場合にtrueを返す。
< x < y xがyよりも小さい場合にtrueを返す。
<= x <= y xがyよりも小さいか等しい場合にtrueを返す。
== x == y xとyが等しい場合にtrueを返す。
!= x != y xとyが等しくない場合にtrueを返す。
instanceof x instanceof y xがyと同じクラスかyのサブクラスである場合にtrueを返す。

【例1】関係演算子を使用した基本的な使用方法を例示します。

public class ExOperator4 {
    public static void main(String[] args) {
        int x = 10;   //(1)
        float y = 10.05F;   //(2)

        if ( y > x ) {   //(3)
            System.out.println("y > xはtrueです。");
        }

        if ( y >= x ) {    //(4)
            System.out.println("y >= xはtrueです。");
        }

        if ( x < y ) {    //(5)
            System.out.println("x < yはtrueです。");
        }

        if ( x <= y ) {    //(6)
            System.out.println("x <= yはtrueです。");
        }
    }
}

解説1

  1. (1)int型変数xに値10を代入します。
  2. (2)float型変数yに値10.05を代入します。
  3. (3)y > xの結果がtrueであるためifブロック内のprintlnメソッドを実行します。
  4. (4)y >= xの結果がtrueであるためifブロック内のprintlnメソッドを実行します。
  5. (5)x < yの結果がtrueであるためifブロック内のprintlnメソッドを実行します。
  6. (6)x <= yの結果がtrueであるためifブロック内のprintlnメソッドを実行します。

実行結果1

D:\JAVA>javac ExOperator4.java

D:\JAVA>java ExOperator4
y > xはtrueです。
y >= xはtrueです。
x < yはtrueです。
x <= yはtrueです。

D:\JAVA>

==、!=の利用について

ここでは、==!=を使用する際の注意点について説明します。Javaのデータ型には大きく分けて基本型(プリミティブ型)と参照型の2つがあります。基本型に対して==!=を使用する際は特に問題はありませんが、参照型に対して使用する際は注意が必要です。==!=を参照型に対して使用する場合、オブジェクトが保有する値を比較しているのではなく、オブジェクトが参照する参照元が同じかを比較していると言う点を意識する必要があります。オブジェクトが保有する値を比較したい場合はequalsメソッドを使用します。

参照元が同じケース

参照元が同じケース

値は同じだが参照元が異なるケース

値は同じだが参照元が異なるケース

【例2】参照型データに対して、参照元が同じケースとオブジェクトの値は同じだが参照元が異なるケースの==演算子の振る舞いの違いについて例示します。

public class ExOperator5 {
    public static void main(String[] args) {
        StringBuffer sampleA = new StringBuffer("abc");   //(1)
        StringBuffer sampleB = sampleA;   //(2)
        System.out.println
        ("sampleAとsampleBは" + (sampleA == sampleB));   //(3)

        StringBuffer sampleC = new StringBuffer("abc");   //(4)
        StringBuffer sampleD = new StringBuffer("abc");   //(5)
        System.out.println
        ("sampleCとsampleDは" + (sampleC == sampleD));   //(6)
    }
}

解説2

  1. (1)new演算子にてオブジェクトsampleAの生成を行います。
  2. (2)代入演算子=にてオブジェクトsampleAをオブジェクトsampleBにコピーします。この場合、新たにメモリ領域にsampleBの領域が確保されるのではなく、sampleAの参照情報のみがsampleBにコピーされます。
  3. (3)sampleAとsampleBを==演算子にて比較を行います。参照元が同じのため、trueが返されます。
  4. (4)new演算子にてオブジェクトsampleCの生成を行います。
  5. (5)new演算子にてオブジェクトsampleDの生成を行います。
  6. (6)sampleCとsampleDを==演算子にて比較を行います。値abcは同じだが、参照元が異なるためfalseが返されます。

実行結果2

D:\JAVA>javac ExOperator5.java

D:\JAVA>java ExOperator5
sampleAとsampleBはtrue
sampleCとsampleDはfalse

D:\JAVA>

instanceofの利用について

ここではinstanceofの使用方法について説明をします。instanceofは左オペランドが右オペランドと同じクラスかそのサブクラスであるかを調べる演算子です。左オペランドには任意のオブジェクト参照式(変数など)、右オペランドにはクラス・インタフェース・配列の型が入ります。具体的な使用方法については以下の例を参照してください。
※オペランドとは演算子が演算対象とするものの意味。

【例3】左オペランドの参照型変数class1の値が右オペランドのExOperator6クラスと同じクラスもしくはサブクラスであるかをinstanceof演算子を使用して調べます。

public class ExOperator6 {
    public static void main(String[] args) {
        sub_ExOperator6 class1 = new sub_ExOperator6();   //(1)

        if (class1 instanceof ExOperator6) {   //(2)
            System.out.println("class1はExOperator6クラスに属します。");
        } else {
            System.out.println("class1はExOperator6クラスに属しません。");
        }
    }
}
public class sub_ExOperator6 extends ExOperator6 { }

解説3

  1. (1)sub_ExOperator6クラスの値をもつ、オブジェクト変数class1を宣言・生成します。
  2. (2)オブジェクト変数class1がExOperator6クラスと同じクラスもしくはサブクラスであるかを instanceof演算子を使用して調べます。class1が保有するデータ型sub_ExOperator6クラスはExOperator6クラスのサブクラスであるため、trueが返されます。

実行結果3

D:\JAVA>javac ExOperator6.java

D:\JAVA>java ExOperator6
class1はExOperator6クラスに属します。

D:\JAVA>

2比較演算子