我刚刚开始用 Java 实现数据结构,想知道我们是否可以遇到这样的情况。
Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>();
如果是的话,请举一个小例子。
如果您没有发现相关问题,请在评论中提及,
You can这样做,但大多数情况下不应该这样做。
映射的键需要保持不变,并且需要设置其 equals 和 hashcode 才能给出正确的行为。如果您在将某个键添加到映射后对其进行修改,那么该映射就会失效。
HashMap 可以修改,因此不应用作键。
为了解释为什么改变它是一个问题,你需要知道哈希图是如何工作的。这非常简单,但假设你有一个HashMap H
包含两个桶。我们称它们为 B0 和 B1。
每当你添加一个Object
to the HashMap
它看着那个物体hashCode
。如果最后一位为 0,则进入 B0,如果为 1,则进入 B1。
现在,当查找一个对象时,它会查看hashCode
并立即转到正确的桶中,然后只需要搜索该桶中的对象即可找到所需的对象。
通过使用超过 2 个存储桶,您可以将每个存储桶中的项目数量减少 2、4、8 或更多倍,从而减少需要检查的对象数量。
然而,假设您将一个对象放入地图中,它会被添加到 B0。然后更改对象,hashCode 也会更改,因此最后一位现在为 1。
如果你这样做map.contains(obj)
你会得到 false 结果,因为它会查看 hashCode,直接跳转到 B1 并且只扫描该对象。但该对象被放置在 B0 中,因为这是插入时的 hashCode。
这就是为什么对于在 HashMap 中用作键的任何对象,hashCode 必须是常量,否则您可能会“丢失”这些键。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)