好奇,在String的hashCode实现中,为什么需要在hashCode实现中创建额外的引用(版本1.8.0_65):
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;
}
考虑到value
是final的,而且只在构造函数中创建(即线程安全),我们为什么需要在这里使用变量val[]的引用呢?
也就是说,这样会起作用吗:
public int hashCode() {
if (hash == 0 && value.length > 0) {
int h = 0;
for (int i = 0; i < value.length; i++) {
h = 31 * h + value[i];
}
hash = h;
}
return hash;
}
除了将值从堆复制到栈以加快速度外,这也涉及到@zapl在评论中描述的竞争条件。在他的评论之前,这对我来说并不明显。
hash
既不是volatile
也没有被同步。这就是为什么他们不会return hash
(你读取的值没有保证)。 - zapl