在一次采访中,有人向我提出了一个有趣的问题,关于Java虚拟机(JVM)如何处理涉及String
类型的switch
语句。具体来说,我被问到JVM是使用LookupSwitch
还是TableSwitch
来执行此操作。我最初的想法是,由于String
哈希码的稀疏性,它将使用LookupSwitch
。然而,面试官通过问:“当两个不同的案例具有相同的哈希码时,JVM如何处理哈希冲突?“
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
对象的切换情况下导航,特别是在涉及哈希冲突的情况下?
对于第一部分的问题,我发现我错了here。编译器必须选择lookupswitch或tableswitch指令
2条答案
按热度按时间pftdvrlh1#
我们可以得出一些结论,而无需特别关注:
tableswitch
用于当被打开的表达式的可能值被合理地聚类时;lookupswitch
否则。大多数散列码将被很好地传播;如果tableswitch
被使用,它可能会很罕见。.equals
来检查我们是否得到了正确的字符串。因此,这大概就是我们解决哈希冲突的方法,通过比较它们。(可以想象,如果有 * 吨 * 的哈希冲突,我们可以回到二进制搜索的事情,但要成为一个现实的场景,* 代码 * 必须以相反的方式编写。pxq42qpu2#
我不会声称自己是Maven,但我同意你对
LookupSwitch
的评估-关于哈希冲突,我想这是用equals()
方法解决的。