我一直很困惑,但是我还没有找到令人信服的答案,那么为什么Java中的String的hashCode
函数没有任何大小限制?以下是我在这里找到的实现:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
首先,我理解了临时变量“h”的用法,这在使用多线程的String时很有意义。其次,我们都知道上述实现无法避免哈希冲突(没有哈希码实现可以避免),所以基本上我们应该将此函数视为仅用于“性能改进”,这对于哈希表或类似结构很有用。
如果是这样,那么为什么我们要允许计算基于所有字符的哈希值,例如100MB的字符串?难道不限制一下吗?32/128甚至1024个字符,而不是整个value.length?是的,如果我们有两个不同的字符串具有与我们所限制长度相同的相同前缀,那么我们会有哈希冲突,但是我们无论如何都无法避免冲突,因此从性能角度来看,我个人会将for循环更改为以下内容:
int limit = value.length > 32 ? 32 : value.length;
for (int i = 0; i < limit; i++) {
h = 31 * h + val[i];
}
你觉得怎么样?