用于字符串哈希的java hashmap的复杂性

时间:2014-12-13 22:46:50

标签: java complexity-theory time-complexity

我正在查看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是字符串中的字符数。

2 个答案:

答案 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。字符串的长度。