43

Java 7 支持使用Strings如下代码进行切换

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

Java 是否equals()在每种String情况下都调用该方法?或者它依赖于==or intern()

这是否等同于:

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

更新:

将 switch 表达式中的 String 与与每个 case 标签关联的表达式进行比较,就好像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

是的。

“当与 String 一起使用时,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 回答