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;
}