Tos*_*kan 35 java performance caching hashmap immutability
所以我读到了HashMap.有人指出:
"Immutability还允许缓存不同键的哈希码,这使得整个检索过程非常快,并建议
Integer
Java Collection API提供的String和各种包装类(例如)是非常好的HashMap
键."
我不太明白......为什么?
Jef*_*rey 33
String#hashCode
:
private int hash;
...
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
Run Code Online (Sandbox Code Playgroud)
由于一个String
永不改变的内容,该类的制造者选择在计算一次之后缓存哈希.这样,时间不会浪费重新计算相同的值.
Nik*_* B. 10
引用链接的博客条目:
具有适当的equals()和hashcode()实现的final对象将充当完美的Java HashMap密钥,并通过减少冲突来提高Java hashMap的性能.
我看不出两者final
并equals()
有任何与哈希冲突.这句话引起了我对该条款可信度的怀疑.它似乎是教条Java"智慧"的集合.
Immutability还允许缓存不同键的哈希码,这使得整个检索过程非常快,并建议String和各种包装类,例如Java Collection API提供的Integer是非常好的HashMap键.
我看到这句话有两种可能的解释,这两种解释都是错误的:
HashMap
缓存不可变对象的哈希码.这是不正确的.地图无法确定对象是否"不可变".所以,如果我们真的是疯了,居然决定使用List
作为一个关键HashMap
和使散列值依赖于内容,而不是列表的标识,我们可以只决定无效于每修改缓存的哈希值,从而将散列计算的数量限制为对列表的修改数量.
这很简单.由于不可变对象不会随时间变化,因此只需要执行一次哈希码的计算.再次计算它将产生相同的值.因此,通常在构造函数(或懒惰)中计算哈希代码并将其存储在字段中.然后hashcode
函数只返回字段的值,这确实非常快.
归档时间: |
|
查看次数: |
13716 次 |
最近记录: |