【问题标题】:If two objects are having same hashCode and qualify equality by equals, than why they fail for == [duplicate]如果两个对象具有相同的hashCode并通过equals来限定相等性,那么它们为什么会因为==而失败[重复]
【发布时间】:2015-12-02 01:45:18
【问题描述】:

请按照以下代码,

    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 具有相同的 hashcode 并通过 equals 限定,但通过 == 不相等,为什么?

是不是因为 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
}
}

在上面的示例中,两个员工对象也具有相同的哈希码并通过 .equals 方法限定相等性,但它们在 == 中的相等性仍然失败。

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

【问题讨论】:

  • 因为 '==' 检查它们在内存中的位置是否相等。它们在内存方面是不同的,但是通过实现 hashcode 和 equals 你说你希望它们在语义上是相等的。

标签: java


【解决方案1】:

Java 中的两个对象只有在共享相同的内存位置(即它们实际上是相同的对象)时才会评估为 ==

在您的第一个示例中,S1S3 相等,因为字符串是不可变的,因此,这些文字可以在编译时由 java 巧妙地转换为单个缓存字符串(我认为这发生在编译时-time,可能是运行时。我对 java 的细节有点模糊,如果有人确定,请随时提供编辑。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多