是否在hashmap中进行O(1)检索?

时间:2013-12-09 12:14:10

标签: java performance algorithm map hashmap

我有一个这样的散列图:

Map<TestBean,String>

其中TestBean是包含几个字符串的POJO类,例如str1str2。如果

,则认为两个TestBean对象obj1obj2相等
obj1.str1=obj2.str1 || obj1.str2==obj2.str1  

那么,当我从这张地图中检索一个值时,它仍然是一个O(1)检索吗?

2 个答案:

答案 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),因为您的地图会成为链接列表。