Java – if文で”==(等価演算子)”を使った条件分岐について解説
Javaのif文で == (等価演算子)を使用すると、左辺と右辺の値が等しいかを比較します。
プリミティブ型(例: int, double)では値そのものを比較しますが、参照型(例: String,オブジェクト)ではメモリ上の参照先が同じかを判定します。
文字列の内容を比較する場合は、equalsメソッドを使用する必要があります。
等価演算子 == とは?
Javaにおける等価演算子 == は、2つの値が等しいかどうかを比較するために使用されます。
この演算子は、プリミティブ型と参照型の両方で使用できますが、その動作は型によって異なります。
- プリミティブ型の場合、値そのものを比較します。
- 参照型の場合、オブジェクトのメモリアドレスを比較します。
このため、同じ内容を持つ2つのオブジェクトがあっても、異なるメモリアドレスを持つ場合は == 演算子はfalseを返します。
以下に、等価演算子 == の基本的な使い方を示すサンプルコードを示します。
public class App {
    public static void main(String[] args) {
        // プリミティブ型の比較
        int a = 5;
        int b = 5;
        System.out.println(a == b); // true
        // 参照型の比較
        String str1 = new String("Hello");
        String str2 = new String("Hello");
        System.out.println(str1 == str2); // false
    }
}true
falseこのコードでは、最初の比較でプリミティブ型の整数を比較し、同じ値であるためtrueが出力されます。
次に、2つのStringオブジェクトを比較すると、異なるメモリアドレスを持つためfalseが出力されます。
プリミティブ型における == の使い方
Javaのプリミティブ型は、基本的なデータ型であり、値そのものを直接扱います。
等価演算子 == を使用することで、これらの値が等しいかどうかを簡単に比較できます。
プリミティブ型には、以下のような種類があります。
| プリミティブ型 | 説明 | 
|---|---|
| int | 整数型 | 
| double | 倍精度浮動小数点型 | 
| char | 文字型 | 
| boolean | 真偽値型 | 
| byte | 8ビット整数型 | 
| short | 16ビット整数型 | 
| long | 64ビット整数型 | 
| float | 単精度浮動小数点型 | 
プリミティブ型の比較は、値そのものを比較するため、非常に直感的です。
以下に、いくつかのサンプルコードを示します。
public class App {
    public static void main(String[] args) {
        // 整数型の比較
        int x = 10;
        int y = 10;
        System.out.println(x == y); // true
        // 浮動小数点型の比較
        double a = 5.5;
        double b = 5.5;
        System.out.println(a == b); // true
        // 文字型の比較
        char c1 = 'A';
        char c2 = 'A';
        System.out.println(c1 == c2); // true
        // 真偽値型の比較
        boolean flag1 = true;
        boolean flag2 = true;
        System.out.println(flag1 == flag2); // true
    }
}true
true
true
trueこのコードでは、異なるプリミティブ型の値を比較しています。
すべての比較で同じ値を持つため、結果はすべてtrueとなります。
プリミティブ型の比較は、値そのものを直接扱うため、非常にシンプルで理解しやすいです。
参照型における == の注意点
Javaの参照型は、オブジェクトを扱うためのデータ型であり、オブジェクトのメモリアドレスを参照します。
等価演算子 == を使用して参照型のオブジェクトを比較する際には、いくつかの注意点があります。
以下にそのポイントを示します。
- メモリアドレスの比較:  ==演算子は、オブジェクトのメモリアドレスを比較します。
同じ内容を持つ異なるオブジェクトは、異なるメモリアドレスを持つため、falseを返すことがあります。
- 同一性と等価性の違い: 同一性(identity)は、オブジェクトが同じメモリアドレスを指しているかどうかを示します。
一方、等価性(equality)は、オブジェクトの内容が等しいかどうかを示します。
内容を比較する場合は、equals()メソッドを使用する必要があります。
以下に、参照型における == の使用例を示します。
public class App {
    public static void main(String[] args) {
        // 参照型の比較
        String str1 = new String("Java");
        String str2 = new String("Java");
        // メモリアドレスの比較
        System.out.println(str1 == str2); // false
        // equalsメソッドを使用した内容の比較
        System.out.println(str1.equals(str2)); // true
        // 同じオブジェクトを参照する場合
        String str3 = str1;
        System.out.println(str1 == str3); // true
    }
}false
true
trueこのコードでは、2つのStringオブジェクトを作成し、それらを == で比較しています。
異なるオブジェクトであるため、最初の比較はfalseとなりますが、equals()メソッドを使用すると内容が等しいためtrueが返されます。
また、同じオブジェクトを参照する場合は、trueが返されます。
このように、参照型の比較ではメモリアドレスと内容の違いを理解しておくことが重要です。
文字列(String)の比較方法
Javaにおける文字列は、参照型の一種であり、Stringクラスを使用して表現されます。
文字列の比較には、等価演算子 == とequals()メソッドの2つの方法がありますが、それぞれの動作は異なります。
以下に、文字列の比較方法について詳しく解説します。
1. 等価演算子 == の使用
等価演算子 == を使用すると、2つの文字列が同じメモリアドレスを指しているかどうかを比較します。
したがって、内容が同じでも異なるオブジェクトであれば、falseが返されます。
2. equals()メソッドの使用
equals()メソッドを使用すると、文字列の内容を比較します。
内容が同じであれば、trueが返されます。
文字列の比較にはこちらの方法を使用することが推奨されます。
以下に、文字列の比較方法を示すサンプルコードを示します。
public class App {
    public static void main(String[] args) {
        // 文字列の作成
        String str1 = new String("Hello");
        String str2 = new String("Hello");
        String str3 = "Hello"; // リテラルで作成
        // 等価演算子による比較
        System.out.println(str1 == str2); // false
        System.out.println(str1 == str3); // false
        // equalsメソッドによる比較
        System.out.println(str1.equals(str2)); // true
        System.out.println(str1.equals(str3)); // true
    }
}false
false
true
trueこのコードでは、3つの文字列を作成し、それぞれを == とequals()メソッドで比較しています。
str1とstr2は異なるオブジェクトであるため、最初の2つの比較はfalseとなりますが、内容が同じであるため、equals()メソッドを使用した比較ではtrueが返されます。
また、リテラルで作成したstr3も内容が同じであるため、equals()メソッドでの比較でもtrueとなります。
このように、文字列の比較には == とequals()メソッドの使い分けが重要です。
内容を比較する場合は、必ずequals()メソッドを使用するようにしましょう。
== と equals の違い
Javaにおける == 演算子とequals()メソッドは、オブジェクトの比較に使用されますが、それぞれの動作は異なります。
以下に、両者の違いを詳しく解説します。
1. 比較の対象
- ==演算子:- メモリアドレスを比較します。
- 同じオブジェクトを参照しているかどうかを判断します。
 
- equals()メソッド:- オブジェクトの内容を比較します。
- 同じ内容を持つオブジェクトであれば、trueを返します。
 
2. 使用する場面
- ==演算子:- 主にプリミティブ型の比較や、同一性を確認したい場合に使用します。
- 参照型のオブジェクトが同じインスタンスであるかどうかを確認する際に使います。
 
- equals()メソッド:- 文字列やカスタムオブジェクトの内容を比較する際に使用します。
- オブジェクトの等価性を確認したい場合に適しています。
 
3. デフォルトの動作
- ==演算子:- すべてのオブジェクトに対してメモリアドレスを比較します。
 
- equals()メソッド:- Objectクラスに定義されており、デフォルトでは- ==と同じ動作をしますが、クラスによってオーバーライドされることが一般的です。
 
以下に、両者の違いを示すサンプルコードを示します。
public class App {
    public static void main(String[] args) {
        // 文字列の作成
        String str1 = new String("Java");
        String str2 = new String("Java");
        //  `==` 演算子による比較
        System.out.println(str1 == str2); // false
        // equalsメソッドによる比較
        System.out.println(str1.equals(str2)); // true
        // 同じオブジェクトを参照する場合
        String str3 = str1;
        System.out.println(str1 == str3); // true
    }
}false
true
trueこのコードでは、str1とstr2は異なるオブジェクトであるため、 == 演算子による比較はfalseとなりますが、equals()メソッドを使用すると内容が同じであるためtrueが返されます。
また、str3はstr1と同じオブジェクトを参照しているため、 == 演算子による比較はtrueとなります。
このように、 == とequals()メソッドは、オブジェクトの比較において異なる役割を持っています。
内容を比較する場合は、必ずequals()メソッドを使用するようにしましょう。
まとめ
この記事では、Javaにおける等価演算子 == とequals()メソッドの違いや、プリミティブ型および参照型における比較方法について詳しく解説しました。
特に、文字列の比較においては、内容を正確に比較するためにequals()メソッドを使用することが重要であることが強調されました。
今後は、オブジェクトの比較を行う際に、適切な方法を選択してプログラミングを進めていくことをお勧めします。
 
![[Java] switch文の中でreturn文を記述するとどうなるのか解説](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50975.png)
![[Java] switch文に条件式を書くとTrue/Falseの分岐だけになるので注意](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50976.png)
![[Java] switch文のdefaultとは?意味や使い方を解説](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50972.png)
![[Java] switch文で複数のcaseで同じ処理を効率よく記述する方法](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50971.png)
![[Java] switch文をbreakなしで記述するとどうなるのか解説](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50970.png)
![[Java] switchで文字列で処理を分岐する方法](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50969.png)
![[Java] switch文のcaseに文字列を使う場合は定数にする必要がある](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50977.png)
![[Java] switch文でnullを使う方法を解説](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50974.png)
![[Java] switch-caseで複数条件を効率よくまとめる書き方を解説](https://af-e.net/wp-content/uploads/2024/11/thumbnail-50968.png)
![[Java] if文の基本的な書き方を初心者向けに解説](https://af-e.net/wp-content/uploads/2024/10/thumbnail-50960.png)
![[Java] if文内でreturn文を書いたときの挙動について解説](https://af-e.net/wp-content/uploads/2024/10/thumbnail-50958.png)
![[Java] if文を1行で簡潔に記述する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-50956.png)