Java 文档 http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html says
Java 编译器从使用 String 对象的 switch 语句生成的字节码通常比从链式 if-then-else 语句生成的字节码更有效。
AFAIK 甚至 switch 中的字符串也使用.equals()
内部以区分大小写的方式。那么在这种情况下,效率意味着什么?编译速度更快?字节码更少?更好的性能?
使用 switch 语句比 equals 更快(但只有当字符串不止几个时才明显),因为它首先使用hashCode
的字符串switch
来确定可能匹配的字符串子集。如果 case 标签中的多个字符串具有相同的 hashCode,则 JVM 将执行顺序调用equals
即使 case 中只有一个字符串标记为 hashCode,JVM 也需要调用equals
确认 case 标签中的字符串确实等于 switch 表达式中的字符串。
String 对象上的 switch 的运行时性能与 String 对象中的查找相当。HashMap
.
这段代码:
public static void main(String[] args) {
String s = "Bar";
switch (s) {
case "Foo":
System.out.println("Foo match");
break;
case "Bar":
System.out.println("Bar match");
break;
}
}
在内部编译并执行如下代码:
(不是字面上的意思,但是如果您反编译这两段代码,您会看到发生完全相同的操作序列)
final static int FOO_HASHCODE = 70822; // "Foo".hashCode();
final static int BAR_HASHCODE = 66547; // "Bar".hashCode();
public static void main(String[] args) {
String s = "Bar";
switch (s.hashCode()) {
case FOO_HASHCODE:
if (s.equals("Foo"))
System.out.println("Foo match");
break;
case BAR_HASHCODE:
if (s.equals("Bar"))
System.out.println("Bar match");
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)