/** Cache the hash code for the string */
private int hash; // Default to 0
//String类将hashCode()的结果缓存为hash值,提高性能。
从这里可知:String的hash值是从0开始算的,然后根据字符数组计算出来//equals方法实现方式
//String对象equals()相等的条件是二者同为String对象,长度相同,且字符串值完全相同;不要求二者是同一个对象。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
//这里可以看出来String值的hash值的计算方法
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;
}
//String str=new string("str");这种方式构造出来的字符串和单独的字面量"str"一定相等的,因为他们的值以及hash值都是相等的
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
测试类
import org.junit.Test;
public class test
{
Object obj=new Object();
String str=new String("123");
@Test
public void test(){
System.out.println(obj.hashCode());
System.out.println("\"123\".hashCode():"+"123".hashCode());
System.out.println(str.hashCode());
int h=0;
for(int i=0;i<"123".length();i++){
char [] val="123".toCharArray();
h=h*31+val[i];
}
System.out.println("h:"+h);
}
}