public static void main(String args[]) {
String str1 = new String("王旭东");
String str2 = new String("王旭东");
StringDemo sd = new StringDemo();
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
System.out.println(sd.hashCode());
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
为什么上面的str1与str2的hashCode值相等????
String str1 = new String("王旭东");
String str2 = new String("王旭东");
StringDemo sd = new StringDemo();
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
System.out.println(sd.hashCode());
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
为什么上面的str1与str2的hashCode值相等????
public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。) 覆盖:
类 Object 中的 hashCode
返回:
此对象的哈希码值。
另请参见:
Object.equals(java.lang.Object), Hashtable
这是API文档中的关于hashCode方法的说明,楼主看看就明白了!
建议楼主平时多看看API文档,虽然这个问题开始我也不清楚,但是我看了API文档后,我一下子就清楚了!
不同对象它有不同的hashCode值,那上面的str1和str2都分别通过new关键来声明了,说明str1和str2是不同的对象了,为什么它们的hashCode值还是一样的,如果照您所说的那个公式的话,下面的代码和开始的还有什么区别了呢????
public static void main(String args[]) {
String str2 = new String("王旭东");
String str3 = "王旭东";
System.out.println(str2.hashCode());
System.out.println(str3.hashCode());
}
String str3 = "王旭东";
这个声明,第一个是直接在堆区创建对象(而不在池中查找及创建),第二个是先在对象池中查找是否有 "王旭东",如果池存在,则引用指向池中的"王旭东",如果池中不存在,则先池中创建"王旭东",再指向。
String str2 = new String("王旭东");
String这个类很特殊,如果想上面这样的是直接赋值,str1 放在的是常量池里面,str2 在池里找有没有"王旭东",有的话就把str2 也指向str1 指向的的那块地址(这地址在常量池中),如果没有的话,则自己创建一个地址,然后str2 指向它,那样的话就不同