web-dev-qa-db-ja.com

Java 7 Stringを含むswitchステートメントはequals()メソッドを使用しますか?

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

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

Java Stringの各ケースでequals()メソッドを呼び出しますか?それとも_==_またはintern()に依存しますか?

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

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

更新:

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

ドキュメントが指摘しているように、振る舞いはequals()が呼び出されるかのようです。

31
Narendra Pathai

docs say

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.

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

29
Aniket Thakur

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

9
Steinar

はい。

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

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

6
Benjamin Dale

switchとともに使用されるStringステートメントは、equals()メソッドを使用して、指定された式をcaseステートメントの各値と比較します。したがって、式がNullPointerExceptionである場合、nullをスローします。

4
Juned Ahsan
1
Saurab Parakh