Java Silver SE11 4章

# Java Silver SE11 4章
[黒本](https://www.amazon.co.jp/gp/product/4295007625/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。

## while文
繰り返し処理に使用される構文。
条件式がtrueの間は処理を繰り返す。
中カッコ{}を省略した場合、次の１行が繰り返し処理の対象になる。

例

```java:while
public class Main {

	public static void main(String[] args) {

		int num = 0;
		while (num < 5) {
			System.out.println("num = " + num);
			num++;
			System.out.println("num++ の結果は " + num);
		}
	}
}
```

```java:結果
num = 0
num++ の結果 1
num = 1
num++ の結果 2
num = 2
num++ の結果 3
num = 3
num++ の結果 4
num = 4
num++ の結果 5
```

## do-while文
while文と違い、先に処理があるので必ず1回は実行される。
中カッコ{}を省略した場合、doとwhielの間には1文のみ記述でき、２文以上はコンパイルエラーになる。

例

```java:do-while
public class Do_while {

	public static void main(String[] args) {

		int num = 0;
		do {
			//出力した後に num = num + 1 が処理される
			System.out.println("num = " + num++);
			System.out.println("num++ の結果は " + num);
		} while (num < 5);
	}
}
```

```java:結果
num = 0
num++ の結果は 1
num = 1
num++ の結果は 2
num = 2
num++ の結果は 3
num = 3
num++ の結果は 4
num = 4
num++ の結果は 5
```

## for文
指定した回数だけ処理を繰り返す時に、よく使われる。
初期化文、条件文、処理内容、更新文を用いる。

例

```java:for
public class For {

	public static void main(String[] args) {

		// 順番
		// 1.初期化文 int i = 0, j = 2;
		// 2.条件分   i < 5;
		//   falseなら終了
		// 3.繰り返し処理 System.out.println(i*j);
		// 4.更新文   i++
		// 2.に戻る
		for (int i = 0, j = 2; i < 5; i++) {
			System.out.println(i*j);
		}
}
```

```java:結果
0
2
4
6
8
```

### よくある間違い
* 初期化文　変数の宣言
  * 複数の変数を宣言するときは、同じ型にする必要がある
  * 初期化で宣言した変数は、for文外で使用することはできず、コンパイルエラーになる
* 条件文
  * カンマ「,」を使い複数条件を記述できない
  * 理論演算子を使い複数条件の判定はできる
  * 省略できる（無限ループになる）
* 更新文
  * 省略できる

```java:for_エラー
public class For {

	public static void main(String[] args) {

		// コンパイルエラー 変数の初期化部分を同じ型にする必要がある
		for (int i = 0, long j = 2; i < 5; i++) {
			System.out.println(i*j);
		}

		// コンパイルエラー scope外(for文外)で変数totalを使用している
		int a = 0;
		for (int b = 2, total = 0; b < 5; b++) {
			total = a*b;
		}
		System.out.println(total);

		// コンパイルエラー カンマによる複数条件は記述できない
		// i < 3 && j < 5 なら可能
		for (int i = 0, j = 2; i < 3, j < 5; i++) {
			System.out.println(i++);
			j += i;
		}
	}
}
```

## 拡張for文
for文から派生し簡単に記述できるようになっていて、
配列やコレクションの全要素に対して、処理を実行する。
(一時変数の宣言 : 配列orコレクション) を用いる。


例

```java:拡張for
	public static void main(String[] args) {
		String [][] array = {{"A", "B", "C"},{"D", "E"}};
		for (Object obj : array) {
			System.out.println(obj);
			// [Ljava.lang.String;@1dbd16a6
			// [Ljava.lang.String;@7ad041f3
		}

		int[] array1 = {1, 2, 3};
		int total = 0;
		for (int i : array1) {
			System.out.println(i); // 1 2 3 を順番に表示
			total += i;
		}
		System.out.println(total); // 6

		// 一時変数のstrに"D"を代入している
		// strの参照先は変更されるが、要素は"D"に変化しない
		// 一時変数str の参照先は "A"
		// そこから "D" に変更される
		// つまり array2[0] の参照先　"A"は変更されていない
		String[]array2 = {"A", "B", "C"};
		for (String str : array2) {
			str = "D";
		}
		for (String str : array2) {
			System.out.print(str); // ABC
		}
	}
```

## break
while文やfor文でbreakを記述することで、繰り返し処理を中断できる。
直近のループのみが中断されるため、スコープ外のループは処理される。

例

```java:break
public class Break {

	public static void main(String[] args) {
		int num = 0;
		while (true) {
			if (num == 2){
				break;
			}
			System.out.println(num); // 0 1
			num++;
		}
	}
}

```

## continue
breakが繰り返し処理を中断し、ループから抜けるのに対して、
continueは繰り返し処理をスキップする。

例

```java:continue
public class Continue {

	public static void main(String[] args) {
		int [] array = {1, 2, 3};
		int total = 0;
		for (int i : array) {
			if (i % 2 == 0) {
				continue;
			}
			total += i;
		}
		System.out.println(total); // 4
	}

}
```

## 2次元配列
配列要素が平面的に並ぶイメージ。
(個人的には数学で学んだ、x軸とy軸のような感じ)

例

```java:2次元配列
public class For_array {

	public static void main(String[] args) {

		int array [][] = new int[][] {{1,2}, {2, 3, 4}};
		int total = 0;
		for (int i = 0; i < array.length; i++) {
			for (int j = i; j < array[i].length; j++ ) {
				total += array[i][j];
			}
		}
		System.out.println(total); // 10

		// 配列要素数が異なる２次元配列
		int array2 [][] = new int[][] {{1,2}, {2, 3, 4}};
		System.out.println(array2.length);      // 2
		System.out.println(array2[0].length);   // 2
		System.out.println(array2[1].length);   // 3
		System.out.println(array2[1][2]);       // 4

		// イメージは縦が長い長方形
		int[][] num = new int[100][3];
		System.out.println(num.length);      // 100
		System.out.println(num[0].length);   // 3
		System.out.println(num[99].length);  // 3
	}
```