带有字符串的 Java 7 开关语句是否使用 equals() 方法?

2022-09-01 01:01:22

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

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

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

这是否等同于:

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

更新:

将 switch 表达式中的 String 与与每个事例标签关联的表达式进行比较,就像使用该方法一String.equals

正如文档所指出的那样,该行为就像被调用一样。equals()


答案 1

文档

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()方法相同,但它不会。


答案 2

Java 7 switch 语句实际上生成了同时使用 和 方法的字节码。哈希代码用于生成更快的开关查找;即,避免像if-else链一样进行相等检查。hashCode()equals()