理解JVM行为:switch如何处理字符串哈希冲突?

v9tzhpje  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(218)

在一次采访中,有人向我提出了一个有趣的问题,关于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指令

pftdvrlh

pftdvrlh1#

我们可以得出一些结论,而无需特别关注:

  • tableswitch用于当被打开的表达式的可能值被合理地聚类时; lookupswitch否则。大多数散列码将被很好地传播;如果tableswitch被使用,它可能会很罕见。
  • 我们从来没有单独使用散列码来完成切换;我们总是需要使用.equals来检查我们是否得到了正确的字符串。因此,这大概就是我们解决哈希冲突的方法,通过比较它们。(可以想象,如果有 * 吨 * 的哈希冲突,我们可以回到二进制搜索的事情,但要成为一个现实的场景,* 代码 * 必须以相反的方式编写。
pxq42qpu

pxq42qpu2#

我不会声称自己是Maven,但我同意你对LookupSwitch的评估-关于哈希冲突,我想这是用equals()方法解决的。

相关问题