我正在查看HashMap类中的java源代码。
final int hash(Object k) {
int h = 0;
if (useAltHashing) {
if (k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h = hashSeed;
}
h ^= k.hashCode();
那么,hashmapObject.put(“somestring”)的时间复杂度是多少? 是O(1)还是O(n),其中n是字符串中的字符数。
答案 0 :(得分:2)
在最坏的情况下(实际上很少发生,只有当我们有一个糟糕的散列函数时)hashmap中put
方法的复杂性为O(N)
,因为尽管我们在开头添加了元素链接列表(O(1)
)但我们仍然需要遍历存储桶(链表)以确定该新元素是否已存在。
的更新强>
根据{8}中的Peter Lawery注释O(log n)
。这个优化被描述为here,但简而言之
当桶的大小超过阈值时,树映射的ad-hoc实现被用作桶。阈值由static final int TREEIFY_THRESHOLD = 8;
HashMap.java
设置
答案 1 :(得分:2)
O(1) w.r.t.地图的大小,这是通常感兴趣的。它是 O(N) w.r.t。字符串的长度。