Javaフロー制御インタビューの質問(回答)

1前書き

制御フローステートメントを使用すると、開発者は意思決定、ループ、分岐を使用して、特定のコードブロックの実行フローを条件付きで変更できます。

この記事では、インタビュー中にポップアップ表示される可能性のあるフロー制御インタビューの質問をいくつか取り上げます。それらの答えをよりよく理解するために例を実装します。

2質問

Q1. if-then および if-then-else ステートメントを説明してください. どのような式を条件として使用できますか?

両方のステートメントは、特定の条件が true と評価された場合にのみ、それらの内部でコードを実行するようにプログラムに指示します。ただし、if句の評価結果が false の場合、 if-then-else 文は実行の二次パスを提供します。

if (age >= 21) {
   //...
} else {
   //...
}

他のプログラミング言語とは異なり、Javaは boolean 式のみを条件としてサポートします。別の種類の式を使用しようとすると、コンパイルエラーが発生します。

Q2. switch ステートメントを説明してください. switch 句ではどのようなオブジェクトタイプを使用できますか?

スイッチでは、変数の値に基づいていくつかの実行パスを選択できます。

各パスには case または default というラベルが付けられ、 switch ステートメントは一致について各 case 式を評価し、 break ステートメントが見つかるまで、一致するラベルに続くすべてのステートメントを実行します。一致するものが見つからない場合は、代わりに default ブロックが実行されます。

switch (yearsOfJavaExperience) {
    case 0:
        System.out.println("Student");
        break;
    case 1:
        System.out.println("Junior");
        break;
    case 2:
        System.out.println("Middle");
        break;
    default:
        System.out.println("Senior");
}

switch の値として、 byte short char int 、それらのラップされたバージョン、 __enum s、 String __sを使用できます。

Q3. break ステートメントを switch case 句に入れるのを忘れた場合はどうなりますか?

switch ステートメントは谷です。つまり、 break ステートメントが見つかるまで、それらのラベルが式の値と一致しない場合でも、すべての case ラベルの実行が続行されます。

これを実証する例を示します。

int operation = 2;
int number = 10;

switch (operation) {
    case 1:
        number = number + 10;
        break;
    case 2:
        number = number - 4;
    case 3:
        number = number/3;
    case 4:
        number = number **  10;
        break;
}

コードを実行した後、 number は6の代わりに20の値を保持します。これは、同じアクションを複数のケースに関連付ける場合に役立ちます。

** Q4. if-then-else ステートメントよりも switch を使用するのが望ましい場合、またその逆の場合

switch ステートメントは、単一の変数を多数の単一値に対してテストする場合、または複数の値が同じコードを実行する場合に適しています。

switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
case 2:
    days = 28;
    break;
default:
    days = 30;
}

値の範囲または複数の条件をチェックする必要がある場合は、 if-then-else ステートメントが適しています。

if (aPassword == null || aPassword.isEmpty()) {
   //empty password
} else if (aPassword.length() < 8 || aPassword.equals("12345678")) {
   //weak password
} else {
   //good password
}

Q5. Javaはどのような種類のループをサポートしていますか?

Javaには、 for while 、および do-while の3種類のループがあります。

for ループは値の範囲にわたって反復する方法を提供します。タスクが何回繰り返されるかを事前に知っておくと便利です。

for (int i = 0; i < 10; i++) {
    //...
}

while ループは、特定の条件が true である間にステートメントのブロックを実行できます。

while (iterator.hasNext()) {
   //...
}

do-while while 文のバリエーションで、 boolean 式の評価はループの最後にあります。

これは、コードが少なくとも一度は実行されることを保証します。

do {
   //...
} while (choice != -1);

Q6. 強化されたforループとは何ですか?

for ステートメントのもう1つの構文は、コレクション、配列、列挙型、または Iterable インターフェースを実装するオブジェクトのすべての要素を反復処理するように設計されています。

for (String aString : arrayOfStrings) {
   //...
}

Q7. どうやってループから抜け出すことができますか?

break ステートメントを使用して、ループの実行をただちに終了できます。

for (int i = 0; ; i++) {
    if (i > 10) {
        break;
    }
}

Q8. ラベルなしステートメントとラベル付き break ステートメントの違いは何ですか?

ラベルの付いていない break ステートメントは、最も内側の switch for while 、または do-while ステートメントを終了します。

これを実証するための例を作成しましょう。

int[][]table = { { 1, 2, 3 }, { 25, 37, 49 }, { 55, 68, 93 } };
boolean found = false;
int loopCycles = 0;

outer: for (int[]rows : table) {
    for (int row : rows) {
        loopCycles++;
        if (row == 37) {
            found = true;
            break outer;
        }
    }
}

番号37が見つかると、ラベル付き break ステートメントは最も外側の for ループを終了し、それ以上のサイクルは実行されません。したがって、 loopCycles は5の値で終了します。

ただし、ラベルなし break は最も内側のステートメントのみを終了させ、制御の流れを最も外側の for に戻します。これにより、 table 変数内の次の row にループが続き、 loopCycles は値8で終了します。

Q9. ラベルなしステートメントとラベル付き continue ステートメントの違いは何ですか?

ラベルなし continue ステートメントは、最も内側の for while 、または do-while ループ内の現在の繰り返しの最後までスキップします。ラベル付き continue は、指定されたラベルでマークされた外側のループまでスキップします。

これを実証する例を示します。

int[][]table = { { 1, 15, 3 }, { 25, 15, 49 }, { 15, 68, 93 } };
int loopCycles = 0;

outer: for (int[]rows : table) {
    for (int row : rows) {
        loopCycles++;
        if (row == 15) {
            continue outer;
        }
    }
}

推論は前の質問と同じです。ラベル付き continue ステートメントは、最も外側の for ループを終了します。

したがって、 loopCycles は値5の保持を終了しますが、ラベルなしバージョンは最も内側のステートメントのみを終了し、 loopCycles は値9で終了します。

** Q10. try-catch-finally 構文内の実行フローを記述します.

プログラムが try ブロックに入り、その中で例外がスローされると、 try ブロックの実行は中断され、スローされた例外を処理できる catch ブロックで制御の流れが続行されます。

そのようなブロックが存在しない場合、現在のメソッドの実行は停止し、コールスタックの前のメソッドに例外がスローされます。

あるいは、例外が発生しない場合は、すべての catch ブロックが無視され、プログラムの実行は通常どおり続行されます。

finally ブロックは、例外が try blockの本体内にスローされたかどうかにかかわらず、常に実行されます。

Q11. どの状況で finally ブロックが実行されない可能性がありますか?

try または catch ブロックの実行中に、たとえば__System.exit()を呼び出してJVMが終了した場合、または実行中のスレッドが中断または強制終了された場合、finallyブロックは実行されません。

==== * Q12。次のコードを実行した結果はどうなりますか?**

public static int assignment() {
    int number = 1;
    try {
        number = 3;
        if (true) {
            throw new Exception("Test Exception");
        }
        number = 2;
    } catch (Exception ex) {
        return number;
    } finally {
        number = 4;
    }
    return number;
}

System.out.println(assignment());

コードは数字3を出力します。たとえ finally ブロックが常に実行されても、これは try ブロックが終了した後にのみ起こります。

この例では、 return ステートメントは try-catch ブロックが終了する前に実行されます。したがって、変数は既に testAssignment メソッドの呼び出しコードに返されているため、 finally ブロック内の number への代入は無効になります。

==== * Q13。例外がスローされない場合でも、どの状況で try-finally ブロックが使用される可能性がありますか?**

このブロックは、 break continue 、または return ステートメントが発生して、コードで使用されているリソースのクリーンアップを誤って回避しないようにする場合に便利です。

HeavyProcess heavyProcess = new HeavyProcess();
try {
   //...
    return heavyProcess.heavyTask();
} finally {
    heavyProcess.doCleanUp();
}

また、スローされている例外をローカルで処理できない、またはリソースを解放できるようにしながら現在のメソッドで例外をスローしたいという状況に直面する可能性があります。

public void doDangerousTask(Task task) throws ComplicatedException {
    try {
       //...
        task.gatherResources();
        if (task.isComplicated()) {
            throw new ComplicatedException("Too difficult");
        }
       //...
    } finally {
        task.freeResources();
    }
}

==== * Q14。 try-with-resources はどのように機能しますか?**

try-with-resources ステートメントは、 try ブロックを実行する前に1つ以上のリソースを宣言して初期化し、ブロックが正常に完了したか突然終了したかにかかわらず、ステートメントの終わりに自動的に閉じます。 AutoCloseable または Closeable インターフェースを実装する任意のオブジェクトをリソースとして使用できます。

try (StringWriter writer = new StringWriter()) {
    writer.write("Hello world!");
}

3結論

この記事では、制御フロー・ステートメントに関して、Java開発者向けの技術面接でよく寄せられる質問のいくつかを取り上げました。これはさらなる研究の始まりとしてのみ扱われるべきであり、網羅的なリストとして扱われるべきではない。

あなたのインタビューで頑張ってください。

"

  • «** 前へ

前の投稿:XStreamユーザーガイド:オブジェクトをXMLに変換
次の投稿:MDBを使用した並行戦略