43

Java 7 はStrings、以下のコードのような切り替えをサポートしています

switch (month.toLowerCase()) {
case "january":
    monthNumber = 1;
    break;
case "february":
    monthNumber = 2;
    break;
default: 
    monthNumber = 0;
    break;
}

equals()Javaは各Stringケースでメソッドを呼び出しますか? または、またはに依存しています==intern()

これは単に次と同等ですか:

String month = month.toLowerCase();
if("january".equals(month)){
monthNumber = 1;
}else if("february".equals(month)){
monthNumber = 1;
}..

アップデート:

スイッチ式の文字列は、メソッドが使用されているのように、各ケース ラベルに関連付けられた式と比較されます。String.equals

ドキュメントが指摘するように、動作はあたかもequals()呼び出されたかのようです。

4

5 に答える 5

43

ドキュメントは言う

The String in the switch expression is compared with the expressions associated
with each case label as if the String.equals method were being used.

内部実装は .equals() メソッドと同じですが、そうではありません。

于 2013-09-05T12:11:03.880 に答える
12

Java 7 の switch ステートメントは、実際にはメソッドhashCode()equals()メソッドの両方を使用するバイトコードを生成します。ハッシュ コードは、より高速なスイッチ ルックアップを生成するために使用されます。つまり、if-else チェーンで得られるような等号チェックのチェーンを避けるためです。

于 2013-09-05T12:15:08.037 に答える
6

はい。

「文字列で使用される場合、switch ステートメントは equals() メソッドを使用して、指定された式を case ステートメントの各値と比較するため、大文字と小文字が区別され、式が null の場合は NullPointerException がスローされます。」

http://java.dzone.com/articles/new-java-7-feature-string

于 2013-09-05T12:08:14.730 に答える
5

a と共に使用されるswitchステートメントStringは、equals()メソッドを使用して、指定された式をステートメント内の各値と比較するcaseため、大文字と小文字が区別されNullPointerException、式が の場合はa がスローされnullます。

于 2013-09-05T12:08:13.497 に答える
1

文字列の切り替えがJava 7でどのように実装されているかを説明する便利な記事を見つけました

于 2014-01-16T06:10:11.063 に答える