在字符串源代码中,似乎只有在至少调用一次public int hashCode()方法后,哈希码值(private int hashCode)才会被设置。这意味着状态不同。但是在以下示例中,哈希码是否会被设置:
String s = "ABC"; ?
Will
String s = "ABC";
s.hashCode();
如何提高后续比较的性能?
在字符串源代码中,似乎只有在至少调用一次public int hashCode()方法后,哈希码值(private int hashCode)才会被设置。这意味着状态不同。但是在以下示例中,哈希码是否会被设置:
String s = "ABC"; ?
Will
String s = "ABC";
s.hashCode();
如何提高后续比较的性能?
Immutable的意思是,从外部看来,对象的值是不可更改的。
如果hashCode
被缓存了,第一次调用hashCode
后,对象的内部状态可能会有所不同。但是该调用是只读的,并且您无法更改对象在外部世界中呈现的值。
换句话说,它仍然是相同的字符串。
hash
值是典型的备忘录技术。 - Stephen C从技术上讲,字符串已经发生了改变。第一次调用hashCode()
时,某个内部字段会被更改。
但是出于所有实际目的,字符串是不可变的。由于对hashCode()
的调用而导致哈希码的值不会改变,只有在第一次调用时才会计算。对于任何使用字符串的消费者来说,字符串都是不可变的。这才是最重要的。
正如Robert Harvey和Greg所述,就实际目的而言,String对象是不可变的(虽然通过反射改变内容可能是可能的,但这是一种hack)。
在构造后立即调用hashCode()
理论上可以提高性能。然而,就实际目的而言,这是过早优化。
不,没有人这样称呼它,因此它也不被称为这个名字。
不可能。调用一个方法多一次怎么可能会让程序更快呢?
public int hashCode() {
int h = hash; // hash is a field in String
if (h == 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;
}
所以: