字符串类如何在java中缓存Hashcode

Here what is written in String API for 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; } 

任何人都可以解释缓存是如何发生的吗?

一个线索是:—- if(h == 0 && value.length> 0){ Code只会进入这个条件,只有这样才能计算哈希码,否则会写入相同的内容。但是如何使用new创建的两个字符串喜欢 :

String a = new String(“abc”); String b = new String(“abc”); 请解释一下

但是如何使用new创建两个字符串:

 String a = new String("abc"); String b = new String("abc"); 

不会发生。 仅对单个String对象进行缓存。

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

对于单个Stringhash是存储哈希码的位置。 如果它为0 ,则重新计算它 - 将其存储在局部变量h - 一旦新计算了哈希码,就将其存储回hash以便将来可以使用。

如果String是可变的,那么在字符串改变之后存储的哈希码将是错误的,因此任何改变字符串的方法都必须将hash重置为0以指示它必须重新重新计算。 但是,在许多不同的层面上,这会变得混乱,这就是String 不可变的原因。

每个字符串对象都有一个名为“hash”的字段。 每当在字符串对象上调用hashcode()时,就会声明一个局部变量int h,其初始值为“hash”字段。 由于最初的哈希值将为零,因此计算该字符串的哈希值并将其存储在哈希字段中。 此后每当在此字符串上调用hashcode()时,将返回“hash”字段值,因为它将是非零值,因此不会进入if条件。

由于String是不可变的,因此可以缓存哈希值。 如果它是可变的,那么这个缓存策略将不起作用。

当您使用new创建两个字符串时,两个字符串将是不同的实例,因此每个字符串都有自己的哈希字段。

 public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 ... 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; } }