java.lang.String的哈希代码真的被缓存了吗?
在这里,即使我在反射的帮助下更改了字符,仍然会维护相同的哈希代码值java.lang.String的哈希代码真的被缓存了吗?,java,string,caching,immutability,Java,String,Caching,Immutability,在这里,即使我在反射的帮助下更改了字符,仍然会维护相同的哈希代码值 这里有什么我需要知道的吗 字符串是不可变的。因此,不必重新计算哈希代码。它在内部缓存在名为hash的int类型的字段中 String#hashCode()实现为(Oracle JDK7) public int hashCode(){ int h=散列; 如果(h==0&&value.length>0){ char val[]=值; for(int i=0;i
这里有什么我需要知道的吗 字符串是不可变的。因此,不必重新计算哈希代码。它在内部缓存在名为
hash
的int
类型的字段中
String#hashCode()
实现为(Oracle JDK7)
public int hashCode(){
int h=散列;
如果(h==0&&value.length>0){
char val[]=值;
for(int i=0;i
其中,hash
最初的值为0
。它将仅在第一次调用该方法时计算
如注释中所述,使用反射破坏了对象的不变性 如果它是相同的值,则缓存它。你还需要什么证据?转到source code.Cool。另一个问题是
何时重新计算?
使用反射会破坏字符串的API,这会导致此意外情况behaviour@kocko:从不,因为字符串是不可变的(除非计算的hashCode为0,这也意味着“尚未计算”)@JBNizet,谢谢。非常酷的面试问题。:)
String s1 = "String1";
System.out.println(s1.hashCode()); // return an integer i1
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[])field.get(s1);
value[0] = 'J';
value[1] = 'a';
value[2] = 'v';
value[3] = 'a';
value[4] = '1';
System.out.println(s1.hashCode()); // return same value of integer i1
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;
}