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

Understanding JVM Behavior: How Does `switch` Handle String Hash Collisions?

提问人:maplemaple 提问时间:9/2/2023 最后编辑:maplemaple 更新时间:9/2/2023 访问量:77

问:

在一次采访中,我被问到一个有趣的问题,关于 Java 虚拟机 (JVM) 如何处理涉及类型的语句。具体来说,有人问我 JVM 是否采用或用于此操作。我最初的想法是,由于哈希码的稀疏性,它会利用。然而,面试官问道:“当两个不同的案例具有相同的哈希码时,JVM 如何处理哈希冲突?switchStringLookupSwitchTableSwitchLookupSwitchString

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

对于第一部分的问题,我发现我在这里错了。编译器必须选择 LookupSwitchTableSwitch 指令

Java JVM 字节 哈希码

评论

3赞 Louis Wasserman 9/2/2023
谁把这个作为面试问题问?!
0赞 maplemaple 9/2/2023
@LouisWasserman一家对冲基金公司,但由于保密协议,我无法透露公司名称。
0赞 user22471702 9/2/2023
如果你真的需要知道,请使用 to 反汇编由该代码生成的类文件(我的系统上的编译器使用 ,然后与文字进行比较,将索引分配给临时的;然后使用 to 做相应的赋值javaplookupswitchtableswitchres)
1赞 user207421 9/2/2023
除非你正在面试 Java 编译器或 JDK 库职位,否则这是一个无关紧要的问题。你可以这样回答:“我不希望这个问题出现在我正在面试的职位上。但是,对于聪明的面试官,除了继续前进之外,你无能为力。
2赞 Holger 9/4/2023
@user207421更糟糕的是,面试问题本身就是一个错误。JVM 根本不处理字符串切换。该阐述甚至承认了面试官的错误心态,将决定(使用哪种指令)归因于 JVM。这让我想起了所有那些“有多少对象有资格获得 gc”的问题,其中唯一正确的答案是:“gc 存在,所以我不必担心,无论您期望什么答案都可能是错误的”。

答:

0赞 Eric 9/2/2023 #1

我不会声称自己是专家,但我同意你对 - 关于哈希冲突的评估,我想这可以通过该方法解决。LookupSwitchequals()

2赞 Louis Wasserman 9/2/2023 #2

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

  • tableswitch当正在打开的表达式的可能值相当聚类时使用; 否则。大多数哈希码将得到很好的传播;如果被使用,它可能会很少见。lookupswitchtableswitch
  • 我们从来没有可以单独使用哈希码来完成切换的情况;无论如何,我们总是必须使用来检查我们是否真的有正确的字符串。因此,大概这就是我们通过比较它们来解决哈希冲突的方式。(可以想象,如果存在大量的哈希冲突,我们可以回退到二进制搜索,但要使这种情况成为现实情况,代码必须以对抗方式编写。.equals