字符串类如何在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; }
对于单个String
, hash
是存储哈希码的位置。 如果它为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; } }
- 线程“main”中的exceptionJava.lang.NoSuchMethodError:main?
- Android Tab Fragment(Eclipse ApI 22)中不推荐使用ActionBarActivity和ActionBar.TabListener
- setOnFocusChangeListener未在Fragment中调用
- JDBC SQLServerException:“此驱动程序未配置为集成身份validation。”
- 如何每5秒更新一次textview变量
- TLS v1.2上的Android客户端/服务器
- int vs Integer比较Java
- 我可以在java中的公共类中调用参数化构造函数中的默认构造函数吗?
- 错误:尝试在空对象引用上调用虚方法’java.lang.Object android.content.Context.getSystemService(java.lang.String)’