不,它不会。这不一定是因为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。如果他们不实施Comparable
,System.identityHashcode
将被要求在平局的情况下做出决定。
正如您从性能角度所说,由于所有这些内部因素,您的平均搜索时间将O(1)
在地图中。