2015-09-06 53 views
-3

请按照下面的代码,如果两个对象有相同的hashCode和平等资格平等,比他们为什么失败==

String s1 = "ABC"; 
    String s2 = new String("ABC"); 
    String s3 = "ABC"; 

    System.out.println(s1.hashCode()); // 64578 
    System.out.println(s2.hashCode()); // 64578  

    System.out.println(" s1 == s2 "+(s1 == s2)); // s1 == s2 false 
    System.out.println(" s1 == s3 "+(s1 == s3)); // s1 == s3 true 

在这里,无论是字符串S1和S2具有相同的哈希码,并通过平等资格,但通过==失败,为什么?

是因为S1和S2是不同的对象,虽然两者都具有相同的哈希码和eqauls qalify,如果是怎么来的,请给我解释一下?

另外,请看看下面的例子中,

class Employee{ 
private Integer employeeCode; 

Employee(Integer empCode){ 
    this.employeeCode = empCode;  
} 

@Override 
public int hashCode(){ 
    return this.employeeCode * 21; 
} 

public boolean equals(Object o){ 
    Employee emp = (Employee) o; 

    return this.employeeCode.equals(emp.employeeCode); 
} 
} 

public class HashCodePractise01{ 


public static void main(String [] args){ 
    Employee e1 = new Employee(1); 
    Employee e2 = new Employee(1); 

    System.out.println(e1.hashCode()); // 21 
    System.out.println(e2.hashCode()); // 21 
    System.out.println("e1.equals(e2) "+(e1.equals(e2))); // e1.equals(e2) true 
    System.out.println("e1 == e2 "+(e1 == e2)); // e1 == e2 false 
} 
} 

在上面的例子中,也都Employee对象具有相同的哈希码和.equals方法资格平等,但他们仍然无法在==平等。

在上述两种情况下,他们为什么两个不同的对象?请解释在Java中

+1

因为“==”检查它们在存储器位置方面相等。他们是不同的内存明智的,但通过实施哈希码,等于你说你希望他们在语义的方式相同。 – SklogW

回答

4

两个物体将只计算为==如果它们共享相同的存储位置(即,如果他们是从字面上相同的对象)。

在你的第一个例子,S1S3是相同的,因为字符串是不可改变的,并且,这样,这些文字可以巧妙地在Java在编译时(我认为这种情况在编译时转换为单一缓存字符串,可能是运行时。我有点Java的细节模糊,随意提供一个编辑,如果有人知道某些)。

0

为了比较两个字符串,你必须使用.equals(),而不是==因为.equals()比较字符串的值,而==比较2个对象(这不会是真的无论如何)。

相关问题