こんにちは、現役SEの「とも」です。
今回は、比較演算子について書きたいと思います。
- 比較演算子は、2つの「リテラルまたは変数」の「整数型や浮動小数点型、文字型」を比較してその結果を返す演算子で、返す結果はboolean型の「true(条件成立)」か「false(条件不成立)」となります。
if文やswitch文、ループ処理でよく使われます。
【整数型と浮動小数点型で使用できる比較演算子】
演算子 | 例 | 説明 |
---|---|---|
< | A < B | AがBより小さい場合は「true」、それ以外は「false」 |
<= | A <= B | AがBと同じか小さい場合は「true」、それ以外は「false」 |
> | A > B | AがBより大きい場合は「true」、それ以外は「false」 |
>= | A >= B | AがBと同じか大きい場合は「true」、それ以外は「false」 |
== | A == B | AがBと同じなら「true」、それ以外は「false」 |
!= | A != B | AがBと同じでないなら「true」、それ以外は「false」 |
【整数型】と【浮動小数点型】の各演算子の記載方法
記載方法は整数型と浮動小数点型で同じため、int型を例にします。
boolean a = 0 < 1; //結果はtrue
boolean b = 1 <= 1; //結果はtrue
boolean c = 2 > 1; //結果はtrue
boolean d = 1 >= 1; //結果はtrue
boolean e = 1 == 1; //結果はtrue
boolean f = 2 != 1; //結果はtrue
以下のように変数を使用することもできます。
int a = 0;
boolean b = a < 1; //結果はtrue
【浮動小数点型】で比較するときの注意点
浮動小数点型で比較する場合、少し注意が必要なポイントがあります。
浮動小数点型の場合は、誤差が発生する可能性があるので、必ずしも意図したように条件が成立しない場合があるということです。
例えば、下の例を見てください。
変数「a」と「b」は10進数の思考で考えると0.1なので、「==」の結果はtrueになると思いがちですが、結果は違ったものになります。
double a = 0.1;
double b = 1 - 0.9;
boolean c = a == b; // 結果がtrueになる想定
System.out.println(c);
System.out.println(a);
System.out.println(b);
結果は以下の通りです。
false
0.1
0.09999999999999998
このような計算誤差が発生するため、厳密に扱う必要がある場合はBigDecimalを使用します。
BigDecimalについては、別の記事で紹介します。
【文字型で使用できる比較演算子】
文字型で比較する場合でも演算子の使い方は同じですが、比較する対象は「文字コード」での比較となります。
例えば、以下のようになります。
char a = 0x0061; //「a」の文字コード
char b = 0x0062; //「b」の文字コード
boolean c = a < b;
System.out.println(c);
System.out.println(a);
System.out.println(b);
結果は以下の通りです。
true
a
b
【注意点】文字列型の比較は、比較演算子では意図した動作とならない
文字列型でも、「==」と「!=」の演算子はコンパイルエラーにはなりませんが、意図した動作とはなりません。
もっと言うと、文字列型というよりは参照型が全般的に同じような動きとなります。
下のような例で試すと、一見正しいように見えます。
【例①】
String a = "あいうえお";
String b = "あいうえお";
boolean c = a == b;
System.out.println(c);
System.out.println(a);
System.out.println(b);
【実行結果】
true
あいうえお
あいうえお
今度は、「b」変数のStringをnewして新しいメモリに文字列を格納してみましょう。
【例②】
String a = "あいうえお";
String b = new String("あいうえお");
boolean c = a == b;
System.out.println(c);
System.out.println(a);
System.out.println(b);
今度は、比較結果がfalseになりました。
【実行結果】
false
あいうえお
あいうえお
このように参照型の場合は、変数に直接入っている「ポインタ」の値で比較してしまいます。
例①では、リテラルの"あいうえお"のポインタを「a」と「b」の変数で持っていたため、trueと判断されていました。
2つ目の例では、リテラルの"あいうえお"のポインタを「a」に格納し、new Stringで新しく確保したメモリのポンタを「b」に格納したため、falseと判断されました。
- 内容の比較が必要な参照型の場合、比較するためのメソッドが用意されているので、演算子ではなくメソッドの方を使います。
参照型で「==」や「!=」を使うケース
参照型で「==」や「!=」を使用するケースもあります。
参照型には、nullという状態を設定することができます。
nullというのは、ポインタに何も入っていない状態を表します。
String a = null;
変数「a」に何も入ってない状態かどうかを判別するために「==」や「!=」を使用します。
boolean = a == null; //aの中身がnullならtrueが設定される
boolean = a != null; //aの中身がnull以外ならtrueが設定される
これらの条件式は、if文やループ文では良く使用されますので、「参照型では変数にポインタが入っている」ということを理解しておく必要があります。
参照型の比較メソッドは、また別の記事で書きたいと思います。
以上、比較演算子でした。