Java 语法糖 - switch 匹配字符串
Java 大约 2286 字本质
switch
匹配字符串本质是先通过比较输入字符串的hashCode
和分支条件对应的字符串的hashCode
是否相同,相同再使用equals
比较字符串是否相同。
取得的临时int
类型后,再使用switch
匹配临时变量的值。
结论:先switch
匹配int
类型字符串hashCode
,再switch
匹配int
类型临时变量。
面试题
问:为什么先hashCode
再equals
?
答:防止哈希冲突。
示例一
Java 代码
public class Test6 {
public void choose(String keywords) {
switch (keywords) {
case "hello":
System.out.println("h");
break;
case "world":
System.out.println("w");
break;
default:
System.out.println("default");
}
}
}
反编译 class
public class Test6 {
public Test6() {
}
public void choose(String keywords) {
byte var3 = -1;
switch(keywords.hashCode()) {
case 99162322:
if (keywords.equals("hello")) {
var3 = 0;
}
break;
case 113318802:
if (keywords.equals("world")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("h");
break;
case 1:
System.out.println("w");
break;
default:
System.out.println("default");
}
}
}
示例二
示例二中字符串BM
和C.
的两个hashCode
相同,所以进入同一分支,再进行equals
判断。
Java 代码
public class Test7 {
public void choose(String keywords) {
switch (keywords) {
case "BM":
System.out.println("BM");
break;
case "C.":
System.out.println("C.");
break;
default:
System.out.println("default");
}
}
反编译 class
public class Test7 {
public Test7() {
}
public void choose(String keywords) {
byte var3 = -1;
switch(keywords.hashCode()) {
case 2123:
if (keywords.equals("C.")) {
var3 = 1;
} else if (keywords.equals("BM")) {
var3 = 0;
}
default:
switch(var3) {
case 0:
System.out.println("BM");
break;
case 1:
System.out.println("C.");
break;
default:
System.out.println("default");
}
}
}
}
阅读 1395 · 发布于 2022-04-24
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
Prometheus+Grafana+mysqld_exporter 监控 MySQL阅读 881
-
Kubernetes kubectl top 命令报 error: Metrics API not available阅读 751
-
Linux tcpdump 保存为 pcap 文件阅读 3203
-
SpringMVC 请求流程阅读 1146
-
Spring Boot JdbcTemplate in 语句注意事项阅读 2773
-
建站必备网址阅读 2733
-
免责声明阅读 3287
-
AndroidStudio 设置 so 库过滤阅读 4054
-
GoJS 右键菜单隐藏和显示事件监听阅读 1390
-
Linux 命令之 OpenSSL 生成 RSA 公钥私钥阅读 2852