-1

考虑以下:

HashMap<String, Object> hm = new HashMap<>();
final String prefix = "My objects ";
int counter = 0;

void put(Object value) {
    hm.put(prefix+(counter++), value);
}

鉴于每个条目的键都以相同的字符串开头,并且仅附加一个数字不同,这是否可能导致更多的冲突?从性能的角度来看,我正在尝试确定这种创建唯一键的方式是否是一个好主意。

4

1 回答 1

2

不,它不会。这不一定是因为String#hashcode; 但是因为 aHashMap将通过对最后 16 位的前 16 位进行异或运算来重新散列您的哈希码。

// this is re-hashing that is done internally
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

但即使这增加碰撞,你也可能永远不会感觉到。对于条目一个接一个(以链接方式)放置的小桶/bin,equals将被调用以获取您关心的实际条目。

如果某个 bin/bucket 达到某个阈值,它将被转换为perfectly balanced tree node. 在这样一棵树中的搜索时间是0(logn)

即使相同的条目在重新散列后报告相同的哈希码,映射仍然必须决定哪个条目更大,以防出现平局。

然后它会尝试调用Comparable#compareTo,以防您的键实现 Comparable。如果他们不实施ComparableSystem.identityHashcode将被要求在平局的情况下做出决定。

正如您从性能角度所说,由于所有这些内部因素,您的平均搜索时间将O(1)在地图中。

于 2017-05-18T11:08:50.930 回答