Javaのお勉強②

比較、論理演算子と条件分岐、繰り返し処理のまとめ

#比較演算子
比較演算子は値を比較する記号で、trueかfalseを返す。
以下の比較演算子が用意されている。

| 演算子 | 例 | 説明 |
|:-:|:-:|:-----------------------------------:|
|>   |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   |

###==と!=を使用する際の注意点
> Javaのデータ型には大きく分けて基本型(プリミティブ型)と参照型の2つがあります。基本型に対して==!=を使用する際は特に問題はありませんが、参照型に対して使用する際は注意が必要です。==!=を参照型に対して使用する場合、オブジェクトが保有する値を比較しているのではなく、オブジェクトが参照する参照元が同じかを比較していると言う点を意識する必要があります。オブジェクトが保有する値を比較したい場合はequalsメソッドを使用します。
引用元）[Javaの道：演算子（２．比較演算子）](http://www.javaroad.jp/java_operator2.htm)

まだ使い分けを意識するほどJavaをやってないけれどいずれ引っかかるところだと思う。
参考）[==演算子とequalsメソッドの違い](https://qiita.com/hys-rabbit/items/1251e86d9d22507d309a)

#論理演算子
###&&
x && y ・・・xとyの両方がtrueのときtrueを返す。

```.java
//xが1
x > 5 && x < 15   //false
//xが10
x > 5 && x < 15   //true
//xが20
x > 5 && x < 15   //false
```
###||
x || y ・・・xとyのいずれかがtrueのときtrueを返す。

```.java
//xが1
x < 5 || x > 15   //true
//xが10
x < 5 || x > 15   //false
//xが20
x < 5 || x > 15   //true
```
###!
!x ・・・xがfalseの場合trueを返す。

```.java
//xが10
x >= 100      //false
!(x >= 100)   //true
```
#if文

```
if (条件式) {
　処理１;
} else {
　処理２;
}
```
条件式がtrueのとき、処理１を実行する。
条件式がfalseのとき、処理２を実行する。
elseは省略可能。

また、以下の様にelse ifを用いて更に条件分岐が可能

```
if (条件式A) {
　処理A;
} else if (条件式B) {
　処理B;
} else if (条件式C) {
　処理C;
} else {
　処理D;
}
```
条件式Aがfalseなら条件式Bを評価し、trueであれば処理Bを実行。
条件式Bもfalseなら条件式Cを評価し、trueであれば処理Cを実行。
全てfalseならelse以下の処理Dを実行。
else ifはいくつでも書くことが可能。
elseは省略可能。
#switch文
if文がブール型の値(true, false)を判断基準にするのに対し、switch文は整数値を判断基準にする。

```
switch (条件式) {
  case 値１:
    処理１;
    break;
  case 値２:
    処理２;
    break;
  default:
    処理３;
    break;
}
```
まず条件式を判別し合致するcaseの値の処理を実行する。
breakはswitch文から抜け出す処理。
例えば条件式の結果が値２と合致した場合、処理２が実行され、その後のbreakでswitch文から抜ける。
また、どのcase値とも合致しない場合defaultの処理３を行い、breakで抜ける。

defaultとbreakは省略が可能。
しかし、**breakを書かなければ処理から抜け出ずに次のcaseの処理を実行してしまう。**

```
//条件式が値１と合致した場合
switch (条件式) {
  case 値１:
    処理１;　　　　　　//breakがないため抜け出ずに次のcaseへ
  case 値２:
    処理２;　　　　　　//処理２も実行する
    break;　　　　　　//ここで抜ける
}
```
意図的に複数のcaseを実行したいとき以外はbreakを書いた方が良さそう。
（というかそういった状況があるのか？）
#while文
```.java
int i = 1;
while (i <= 3) {
  System.out.println("iは" + i + "です");
  i++;
}

/*結果
iは1です
iは2です
iは3です
*/
```
条件式の中を判別し、trueならば{}の処理を実行。
その後再び条件式を判別し、trueであり続ける限り繰り返す。
falseであれば終了する。また初めからfalseの場合は１度も処理は実行されない。

条件式がtrueである限りループを繰り返すので、**いつかはfalseになるように処理を書かなければ無限ループになる**。上記の場合i++;を書いていないと無限ループになる。
#for文

```
for (変数の初期化; 条件式; 変数の更新) {
　　処理;
}
```
変数の初期化では繰り返し処理の判断に用いられるローカル変数(int i = 0;など)の初期化を行う。
条件式ではブール型の値(true, false)を返す条件を書く。
処理を行った後、変数の更新をする(i++など)。

```.java
for (int i = 0; i < 5; i++) {
  System.out.println("iは" + i + "です");
}

/*結果
iは0です
iは1です
iは2です
*/
```
#breakとcontinue
###break
breakを用いることで繰り返し処理を強制終了させることが可能。
if文などの条件分岐と組み合わせる。

```.java
for (int i = 1; i <= 5; i++) {
  if(i > 3) {   //iが4になると強制終了
    break;
  }
  System.out.println("iは" + i + "です");
}

/*結果
iは1です
iは2です
iは3です
*/
```
###continue
その周の処理だけスキップする。
if文などの条件分岐と組み合わせる。

```.java
for (int i = 1; i <= 5; i++) {
  if (i % 2 == 0) {   //iが偶数のときその周のループを終了し次のループへ
    continue;
  }
  System.out.println("iは" + i + "です");
}

/*結果
iは1です
iは3です
iは5です
*/
```