HashMap 的传统实现是使用一个函数生成一个键,然后使用该键直接访问一个值。将其视为生成将转换为数组索引的内容。它不会通过 hashmap 比较元素散列和生成的散列;它生成散列,并使用散列直接访问元素。
我认为您在谈论的是 HashMap 中的两个值生成相同键的情况。然后它使用这些列表,并且必须查看它们以确定它想要哪个。但这不是 O(n),其中 n 是 HashMap 中的元素数,只是 O(m),其中 m 是具有相同散列的元素数。显然,游戏的名称是找到一个散列函数,其中生成的散列对于所有元素都是唯一的,尽可能多。
--- 编辑以扩展解释 ---
在您的帖子中,您说:
通过阅读许多以前的帖子,我观察到 HashMap 使用链表来存储键值列表。
这对于整个 HashMap 来说是错误的。为了让HashMap合理工作,必须有一种方法可以使用键计算直接访问相应元素的方法,而不是通过搜索HashMap中的所有值。
“完美”的哈希计算会将每个可能的键转换为未针对任何其他键计算的哈希值。这通常是不可行的,因此两个不同的键通常可能会导致哈希计算的相同结果。在这种情况下,HashMap 实现可以使用值的链接列表,并且需要查看所有这些值以找到它正在寻找的值。但是这个数字远小于整个 HashMap 中的值的数量。
您可以创建一个哈希,其中字符串是键,其中字符串的第一个字符被转换为一个数字,然后用作数组索引。只要您的字符串都有不同的第一个字符,那么访问该值就是一个简单的计算加上一个数组访问——O(1)。或者您可以将字符串索引的所有字符值加在一起并取最后两位(或三位)数字,这将是您的哈希计算。只要添加为每个索引字符串生成唯一值,您就不必查看列表;再次,O(1)。
而且,事实上,只要哈希计算近似完美,查找总体上仍然是 O(1),因为您必须查看短列表的有限次数不会改变整体效率。