String s1 = new String("abc");//it is created at heap area
String s2 = "abc";//it is created string constant pool
System.out.println(s1==s2);//false
System.out.println(s1.hashCode());same hashCode
System.out.println(s2.hashCode());same hashCode
最后两行给出了相同的hashCode()
,但是对象是不同的。在创建s1对象时,它在堆区域中创建,s2对象在string常量池中创建。但两者都给出相同的hashCode.ie my疑问?
答案 0 :(得分:3)
返回此字符串的哈希码。
String
对象的哈希码 计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用
int
算术,其中s[i]
是字符串的ith
字符,n
是字符串的长度 字符串,^
表示取幂。 (空的哈希值 string为零。)
由于String
个对象具有相同的字符,因此它们的哈希码相等。
答案 1 :(得分:2)
因为String#hashCode()
基于字符内容,而不是对象标识:
/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
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;
}
答案 2 :(得分:0)
最简单的答案:根据定义,当两个对象相等时 - 这里定义为具有相同的内容 - 它们应该具有相同的hashCode。这称为这些方法的合同。例如,违反合同的类将不能用作HashMap中的键,否则通常会被破坏。
答案 3 :(得分:0)
这一行:
String s1 = new String("abc");
创建一个新的String
对象。这一行:
String s2 =&#34; abc&#34 ;;
创建一个插入到字符串池的String
对象(String常量"abc"
的所有使用都将使用池中的同一个对象。)
==
比较两个操作数是否是相同的对象,因此s1 == s2
符合预期的false
。
不同对象的散列码不需要不同。如果哈希代码具有相同的值,则必须是相同的 - 即a.equals(b)
。如果两个字符串对象具有相同的值,那么它们将具有相同的哈希码:哈希码与预期的相同。
答案 4 :(得分:-1)
“==”运算符比较对象在内存中的位置
我想你应该阅读&#34; .equals&#34;之间的区别。和&#34; ==&#34;。请参阅以下链接