我正在学习使用 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)
}
这让我感到:
{(a,1)=value1}
{(a,1)=value1, (b,1)=value2}
{(a,1)=value1}
{(a,1)=value1, (b,1)=value2}
我认为 HashMap
的 冲突 会导致一个列表。但是当我尝试使用 Kotlin 中的 mutableMapOf
(它是 LinkedHashMap
)时,我也没有遇到任何冲突。
问题:
- 这个简单的冲突示例中,我错过了什么?
- 每种
Map
实现的最常见冲突行为是什么?
hashCode()
方法的约定是相等的对象 必须 具有相同的哈希码;但是不相等的对象不 需要 具有不同的哈希码 —— 尽管这并不理想,但不同的对象具有相同的哈希码也是可以接受的。因此,任何使用哈希码的内容(如映射)都必须考虑到这一点。(Java文档中更明确地说明了这一点。) - gidds