我有一个这样的散列图:
Map<TestBean,String>
其中TestBean
是包含几个字符串的POJO类,例如str1
,str2
。如果
obj1
和obj2
相等
obj1.str1=obj2.str1 || obj1.str2==obj2.str1
那么,当我从这张地图中检索一个值时,它仍然是一个O(1)检索吗?
答案 0 :(得分:2)
如果哈希码实现相当统一,它应该是O(1)
- 在最坏的情况下(如果所有内容都被散列到同一个桶),它可能是O(N)
。
麻烦的是,对于这个具体的例子,你确切地说是最糟糕的情况 - 考虑到你的或者是平等的条件,我看不到一种明智的方法来实现等价对象必须具有的hashCode
契约除了简单地为每个对象返回相同的代码之外的哈希码。
事实上,在这种情况下,我认为你甚至不能定义明确的equals()
,因为你的条件既不对称也不传递
a1(str1 = "A", str2 = "B")
a2(str1 = "B", str2 = "C")
a3(str1 = "C", str2 = "D")
a1.equals(a2)
但!a2.equals(a1)
a1.equals(a2)
和a2.equals(a3)
,但!a1.equals(a3)
。答案 1 :(得分:1)
摊销时间复杂度为O(1)
。此取决于hashcode
函数的实现。如果你有很多碰撞,你的复杂性就会增加。
因此,在最佳情况下基本上是O(1)
,当O(n)
产生更多碰撞时,它会关闭hashcode
。如果您的hashcode
函数在所有情况下都返回相同的数字,那么您就会到达O(n)
,因为您的地图会成为链接列表。