使用标准的 hashmap 不可能有效地做到这一点(无需经历所有事情)。 hashmap 的目的是提供对元素的快速访问,而内存开销很小。考虑你有一个整数大小的数组和一个哈希码函数,它为每个存储的对象返回整数。然后,您将能够通过应用 index = hashcode(key) 找到元素,这基本上是 1 个操作来查找任何内容。但是你有一个可怕的内存开销(数组大小等于所有整数)。
其他选项是有一个列表并遍历所有元素。在这里您不会有内存开销,但搜索复杂度将是 O(n) - 您需要遍历所有内容以确保该元素不在数组中(或尽快找到它)。
Hashmap 在中间。您分配大小的数组,假设为 100。然后计算键的哈希码函数,结果为 105。因此,您将对象放在索引 {hashcode_result} 模数组大小上。在我们的例子中 105 % 100 == 5。
有趣的东西取决于实现,你会做什么,如果你有一个碰撞,它作为一个 key2 具有相同的位置。例如,如果哈希码值为 205、305...(对于所有这些哈希码,模数将为 5)。
一种可能性是将这些附加元素添加到下一个可用索引 6、7...
在 java 中(或者至少据我所知),桶是作为链表实现的,所以你将拥有
0 => []
1 => []
2 => []
3 => []
4 => []
5 => [k=105, k=205, k=305...]
在你的用例中使用 hashmap 的唯一方法是实现一个 hashcode 函数,它总是为同一个类生成相同的 hash。但这会将哈希图退化为 n 个列表,其中 n 是子类的数量。并且查找将受到严重影响(您将不得不执行 M/n 操作来查找值,其中 M 是元素的数量,n 是不同类的数量),而正确实现的 hashmap(hashcode 值的均匀分布)保证查找次数实际上等于 1。
长话短说 - 由于 hashmap 的结构,您无法有效地执行任何类型的数据相关 loopkup(您会破坏搜索列表的性能)。
如果你想进行这种类型的查找,john16384的答案是一个非常好的答案。