提问人:maplemaple 提问时间:9/2/2023 最后编辑:maplemaple 更新时间:9/2/2023 访问量:77
了解 JVM 行为:“switch”如何处理字符串哈希冲突?
Understanding JVM Behavior: How Does `switch` Handle String Hash Collisions?
问:
在一次采访中,我被问到一个有趣的问题,关于 Java 虚拟机 (JVM) 如何处理涉及类型的语句。具体来说,有人问我 JVM 是否采用或用于此操作。我最初的想法是,由于哈希码的稀疏性,它会利用。然而,面试官问道:“当两个不同的案例具有相同的哈希码时,JVM 如何处理哈希冲突?switch
String
LookupSwitch
TableSwitch
LookupSwitch
String
class Solution {
static int switchString(String i) {
int res;
switch (i) {
case "A": // hashcode 65
res = 0;
break;
case "FB": // hashcode 2236
res = 1;
break;
case "Ea": // hashcode 2236
res = 2;
break;
default:
res = 3;
}
return res;
}
public static void main(String[] args) {
System.out.println(switchString("Ea"));
}
}
您能否帮助阐明 JVM 如何在涉及对象的交换机案例中导航,尤其是在涉及哈希冲突时?String
对于第一部分的问题,我发现我在这里错了。编译器必须选择 LookupSwitch 或 TableSwitch 指令
答:
0赞
Eric
9/2/2023
#1
我不会声称自己是专家,但我同意你对 - 关于哈希冲突的评估,我想这可以通过该方法解决。LookupSwitch
equals()
2赞
Louis Wasserman
9/2/2023
#2
我们可以得出一些结论,而无需特别关注:
tableswitch
当正在打开的表达式的可能值相当聚类时使用; 否则。大多数哈希码将得到很好的传播;如果被使用,它可能会很少见。lookupswitch
tableswitch
- 我们从来没有可以单独使用哈希码来完成切换的情况;无论如何,我们总是必须使用来检查我们是否真的有正确的字符串。因此,大概这就是我们通过比较它们来解决哈希冲突的方式。(可以想象,如果存在大量的哈希冲突,我们可以回退到二进制搜索,但要使这种情况成为现实情况,代码必须以对抗方式编写。
.equals
评论
javap
lookupswitch
tableswitch
res
)