Java 中的 HashMap 使用 hashCode() 和 equals() 方法的组合来有效地存储和检索键值对。当添加新的键值对时,首先计算键的hashCode()方法,以确定该条目将被放置在哪个哈希桶中。然后使用 equals() 方法检查所选存储桶中的重复键。
在给定的测试代码中,ToDos 类定义了 equals() 的原始实现,确保具有相同日期字段的对象将被视为平等。当行 // public int hashCode() { return 9;如果取消注释,所有 ToDos 对象,无论其日期字段如何,都被迫返回相同的 hashCode() 值。因此,所有 ToDos 对象都映射到同一个哈希桶,无论其日期字段如何。
当使用注释掉的行调用 map.size() 方法时,具有不同日期的 ToDos 对象字段(t1、t2、t3)由于其不同的 hashCode() 值而被放置在不同的哈希桶中。因此,map.size() 准确地返回三的计数。
相反,当该行取消注释时,ToDos 对象全部映射到同一个哈希桶,map.size() 方法随后返回数二。这是因为 HashMap 认为所有 ToDos 对象“逻辑上等效”,因为它们返回相同的 hashCode() 值。
总而言之, hashCode() 和 equals() 方法的使用是对于HashMap的高效运行至关重要。通过仅重写 hashCode() 方法,必须确保逻辑上等效的键生成一致的 hashCode() 值。仅重写 equals() 方法可能会导致性能问题,因为确定逻辑等效性所需的比较次数会增加。在通过 hashCode() 进行高效散列和通过 equals() 确保对象相等之间取得适当的平衡是最佳 HashMap 使用的关键。
以上是重写 `hashCode()` 和 `equals()` 如何影响 HashMap 性能?的详细内容。更多信息请关注PHP中文网其他相关文章!