为什么 String s1= "cat" 和 String s2= new String("cat") 的哈希码相同?
Why hash code is same for String s1= "cat" and String s2= new String("cat")?
程序:
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
输出:
false
98262
98262
如果S1和S2指向不同的内存地址,那么它们的哈希码应该不同?请解释它们如何相同?
If S1 and S2 are pointing to different memory address, then Hash code should be different for them?
不,哈希码不是这样工作的。如果两个对象是 equal
,它们的哈希码也必须相等。 "where in memory" 他们坐着没关系。
哈希码基于某些对象的内容。
而 == 比较引用,或者换句话说:"positions" 在内存中。
因此两个对象很可能具有相同的 hashcode()
(因为,嗯:相同的内容);但属于两个不同的引用。
顺便说一句,为什么您总是总是使用 equals()
方法比较字符串;而不是==。
来自documentation of hashCode():
Returns a hash code for this string. The hash code for a String object
is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using
int arithmetic, where s[i] is the ith character of the string, n is
the length of the string, and ^ indicates exponentiation.
由于两个字符串中的值相同,因此哈希码相同。
c 的 ASCII 值为 99,a 为 97,t 为 116。因此,
hashcode of s1 = 99 * 31^2 + 97 * 31^1 + 116 = 95139 + 3007 + 116 = 98262.
s2 的哈希码也将是 98262。这就是相等的值使哈希码相同的方式。
hashCode()
是String
class的public实例方法,return根据内容取整型值
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
在上面的代码中,s1
和s2
的内容相同("cat"),所以returned的整数是相同的。
程序:
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
输出:
false
98262
98262
如果S1和S2指向不同的内存地址,那么它们的哈希码应该不同?请解释它们如何相同?
If S1 and S2 are pointing to different memory address, then Hash code should be different for them?
不,哈希码不是这样工作的。如果两个对象是 equal
,它们的哈希码也必须相等。 "where in memory" 他们坐着没关系。
哈希码基于某些对象的内容。
而 == 比较引用,或者换句话说:"positions" 在内存中。
因此两个对象很可能具有相同的 hashcode()
(因为,嗯:相同的内容);但属于两个不同的引用。
顺便说一句,为什么您总是总是使用 equals()
方法比较字符串;而不是==。
来自documentation of hashCode():
Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation.
由于两个字符串中的值相同,因此哈希码相同。
c 的 ASCII 值为 99,a 为 97,t 为 116。因此,
hashcode of s1 = 99 * 31^2 + 97 * 31^1 + 116 = 95139 + 3007 + 116 = 98262.
s2 的哈希码也将是 98262。这就是相等的值使哈希码相同的方式。
hashCode()
是String
class的public实例方法,return根据内容取整型值
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
在上面的代码中,s1
和s2
的内容相同("cat"),所以returned的整数是相同的。