public class AboutStrings{
public static void main(String args[]){
String s1="hello";
String s2="hel";
String s3="lo";
String s4=s2+s3;
//to know the hash codes of s1,s4.
System.out.println(s1.hashCode());
System.out.println(s4.hashCode());
// these two s1 and s4 are having same hashcodes.
if(s1==s4){
System.out.println("s1 and s4 are same.");
}else
System.out.println("s1 and s4 are not same.");
}
}
在上面的例子中,即使s1和s4正在引用 相同的对象(具有相同的哈希码),
是打印s1和s4不相同。
任何人都能详细解释为什么会这样吗?
答案 0 :(得分:7)
仅仅因为两个对象具有相同的哈希代码 不意味着它们是相同的对象(您正在检查==对象身份!)。
您可能想要致电
s1.equals(s4)
相反 - 但即便如此,两者都可以使用相同的哈希码,而不等于:两个相等的必须的对象具有相同的哈希码(才能正常工作)在集合等),但反之亦然。
答案 1 :(得分:2)
使用==
,您正在检查Strings
的两个引用是否相同。
您要做的是检查以确保两个对象相等。
这样做:
if(s1.equals(s4)){
System.out.println("s1 and s4 are same.");
} else {
System.out.println("s1 and s4 are not same.");
}
仅仅因为两个Object
具有相同的哈希码,并不意味着它们是同一个对象。
答案 2 :(得分:0)
==检查两个对象是否相同,而不是它们的内容是否相同。要比较两个对象的内容,请使用.equals。既不是==也不是等于使用哈希码。
if(s1.equals(s4)){
System.out.println("s1 and s4 are same.");
}else{
System.out.println("s1 and s4 are not same.");
}
答案 3 :(得分:0)
原因是声明String s1="hello"
;创建一个新对象,语句String s4=s2+s3;
创建一个全新的对象。因此,尽管它们具有相同的字符,但它们的哈希码是不同的。你可能想用.equals()
方法代替!!
答案 4 :(得分:0)
请参阅Joshua Bloch撰写的 Effective Java:Second Editions 中的以下内容:
equals
hashCode
equals
从这些项目中,一切都应该更清晰。虽然没有语言功能来强制执行此操作,但相同的对象应具有相同的哈希码。具有相同哈希码的对象不一定相等。当然,具有相同哈希码的对象不需要是相同的。
答案 5 :(得分:0)
如果实习生您的字符串,则可以使用参考比较。参考比较比调用equals方法快得多,尽管通常花费的总时间可以忽略不计。