对象相同但输出不同?请帮忙

时间:2009-11-16 06:33:40

标签: java

  

可能重复:
  String equality vs equality of location

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不相同。

任何人都能详细解释为什么会这样吗?

6 个答案:

答案 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 中的以下内容:

  • 第8项:在覆盖equals
  • 时遵守一般合同
  • 第9项:覆盖hashCode
  • 时始终覆盖equals

从这些项目中,一切都应该更清晰。虽然没有语言功能来强制执行此操作,但相同的对象应具有相同的哈希码。具有相同哈希码的对象不一定相等。当然,具有相同哈希码的对象不需要是相同的

答案 5 :(得分:0)

如果实习生您的字符串,则可以使用参考比较。参考比较比调用equals方法快得多,尽管通常花费的总时间可以忽略不计。