Java Silver SE11 4章
黒本をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。
while文
繰り返し処理に使用される構文。
条件式がtrueの間は処理を繰り返す。
中カッコ{}を省略した場合、次の1行が繰り返し処理の対象になる。
例
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);
}
}
}
結果
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文のみ記述でき、2文以上はコンパイルエラーになる。
例
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);
}
}
結果
num = 0
num++ の結果は 1
num = 1
num++ の結果は 2
num = 2
num++ の結果は 3
num = 3
num++ の結果は 4
num = 4
num++ の結果は 5
for文
指定した回数だけ処理を繰り返す時に、よく使われる。
初期化文、条件文、処理内容、更新文を用いる。
例
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);
}
}
結果
0
2
4
6
8
よくある間違い
- 初期化文 変数の宣言
- 複数の変数を宣言するときは、同じ型にする必要がある
- 初期化で宣言した変数は、for文外で使用することはできず、コンパイルエラーになる
- 条件文
- カンマ「,」を使い複数条件を記述できない
- 理論演算子を使い複数条件の判定はできる
- 省略できる(無限ループになる)
- 更新文
- 省略できる
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コレクション) を用いる。
例
拡張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を記述することで、繰り返し処理を中断できる。
直近のループのみが中断されるため、スコープ外のループは処理される。
例
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は繰り返し処理をスキップする。
例
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軸のような感じ)
例
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
// 配列要素数が異なる2次元配列
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
}