Java 为什么';没有碰撞吗?

Java 为什么';没有碰撞吗?,java,kotlin,hashmap,Java,Kotlin,Hashmap,我正在与Kotlin研究地图,并决定运行以下代码: fun main() { data class KeyClass(val equals: String, val hash: Int) { override fun equals(other: Any?): Boolean { return this.equals == (other as KeyClass).equals } override fun hashC

我正在与Kotlin研究地图,并决定运行以下代码:

fun main() {
    data class KeyClass(val equals: String, val hash: Int) {
        override fun equals(other: Any?): Boolean {
            return this.equals == (other as KeyClass).equals
        }

        override fun hashCode(): Int {
            return hash
        }

        override fun toString(): String {
            return "($equals,$hash)"
        }
    }

    // collision, since their hashes are the same but they are not equal
    val a1 = KeyClass("a", 1)
    val a2 = KeyClass("b", 1)
    val map = HashMap<KeyClass, String>()
    map[a1] = "value1"
    println(map)
    map[a2] = "value2"
    println(map)

    val map2 = mutableMapOf<KeyClass, String>()
    map2[a1] = "value1"
    println(map2)
    map2[a2] = "value2"
    println(map2)
}
我想是HashMap。然后,当我尝试Kotlin的
LinkedHashMap
mutableMapOf
时,我也没有遇到任何冲突

问题

  • 我在这个简单的碰撞示例中遗漏了什么
  • 每个
    Map
    实现中最常见的冲突行为是什么

  • 您正在谈论的列表是一个内部实现细节。你不能说这是地图内部发生的事情,这就是封装的要点

    观察碰撞的唯一方法是计时。因此,创建一百万个字符串,将它们放入映射中,然后对其中的条目运行几次
    .containsKey()

    然后,重复这个练习,但这次,创建一百万个碰撞的对象(相同的哈希代码)。然后,再次对其中的条目运行几次
    .containsKey()

    您会注意到,第二个操作返回完全相同的答案,但是,运行速度要慢得多,这是您将要观察到的唯一情况


    *)通过定时观测,你可以猜测它,但这就是它的极限。

    你确实遇到了碰撞。可能结果并不是你所期望的。您遇到了哈希代码冲突,这会减慢映射的插入和检索时间。我认为您希望映射只包含1个条目,但即使哈希代码与键的相等项不匹配,因此您仍将2个不同的键放入映射中,生成2个条目。

    HashMap可以描述每个键哈希的多个键值对。这意味着冲突会使HashMap变慢,但它仍然可以正常工作;但是不相等的对象不需要不同的散列码——不同的对象拥有相同的散列码是完全可以接受的(尽管不可取)。  (关于这一点,专家们更为明确。)  所以任何使用散列码(如映射)的东西都必须考虑到这一点。
    {(a,1)=value1}
    {(a,1)=value1, (b,1)=value2}
    {(a,1)=value1}
    {(a,1)=value1, (b,1)=value2}