2014-10-07 109 views
1
  1. 我同时覆盖hashCode()和equals()方法,但我不修改重写方法内部的任何物件。重写的hashCode()和equals()方法

    @Override 
    public int hashCode() { 
        int hash = 7; 
        hash = 67 * hash + Objects.hashCode(this.model); 
        hash = 67 * hash + this.year; 
        return hash; 
    } 
    
    @Override 
    public boolean equals(Object obj) { 
        if (obj == null) { 
         return false; 
        } 
        if (getClass() != obj.getClass()) { 
         return false; 
        } 
        final PC other = (PC) obj; 
        if (!Objects.equals(this.model, other.model)) { 
         return false; 
        } 
        if (this.year != other.year) { 
         return false; 
        } 
        return true; 
    } 
    
  2. 我创建2个相同的对象:

    PC One = new PC(); 
    
    One.setModel("HP"); 
    
    One.setYear(2013); 
    
    PC Two = new PC(); 
    
    Two.setModel("HP"); 
    
    Two.setYear(2013); 
    
  3. 我比较这些2个对象:

    if (One.equals(Two)) { 
    
         System.out.println("They are the same objects!"); 
    
        } else { 
    
         System.out.println("They are different objects!"); 
        } 
    

的结果是: “他们是同一对象” 。但是,如果我不覆盖这两种方法,结果将是:“它们是不同的对象!”。 因为hashCode对于每个对象都是唯一的(我想),我期望它的结果是:“它们是不同的对象!”。 问:为什么?

+0

“PC”的超类是什么? – 2014-10-07 18:33:22

+3

你的重写“equals”是什么样的? – Eran 2014-10-07 18:33:41

+0

@PatriciaShanahan,Class Object,意思是PC没有我定义的超类。 – Insanovation 2014-10-07 18:35:57

回答

4

默认equals执行Object使用实例的引用地址。两个Objects只有在它们驻留在内存中的相同位置时才是相等的。

如果您不覆盖equals这是您得到的实现。

此外,此行为与hashCode无关,您是不是拨打hashCode。如果您直接拨打equals,则不会使用hashCode。通常在数据结构中使用hashCode,就像HashMap一样。

3
@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final PC other = (PC) obj; 
    if (!Objects.equals(this.model, other.model)) { 
     return false; 
    } 
    if (this.year != other.year) { 
     return false; 
    } 
    return true; 
} 

这个方法声称是equals方法的默认实现是不正确的。等于缺省值,通过==相等运算符进行比较,该运算符将32位或64位指针引用与JVM内存位置进行比较。勾选此link

public boolean equals(Object obj) { 
     return (this == obj); 
} 
+0

我没有声称它是equals()方法的默认实现,尽管我想确保在我的问题中提供的equals()方法不是默认一个。谢谢。 – Insanovation 2014-10-07 19:04:23

1

如果不重写equals,你PC对象继承equals method from Object,执行同样的事情== - 比较对象引用,看看他们是否是同一个对象。

Object类的equals方法实现对象上最可能的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x == y的值为true)时,此方法返回true。

所以,你equals方法比较你PC对象的内部内容后返回true,但不重写时,Objectequals方法返回false,因为它们是不同的对象。

0

equals()方法比较2个正常目的,等号的默认实现时方法用于()是基于所述对象的内存位置。

然而,的hashCode()只用散列数据结构使用,如:的HashSet,HashMap中,哈希表 ..

每当一个元素添加到这些结构,或搜索元素,结构使用对象的哈希代码并将其与现有哈希代码进行比较,以确定该元素是否已存在。

tutorial很好地描述了这两个平等的使用()hashCode()方法方法时,它的必要覆盖他们。

相关问题