Android知识

设计重写equals()和hashCode()

2016-07-01  本文已影响177人  冯奕欢

我们一般不会动这两个方法,但是如果我们达到某种需求,如object1.equals(object2)为true,那你必须得重写这两个方法。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
怎么重写,我们先定义一个类:

class ObjectM {
    int id;
    String name;
  }

那我们先重写equals(),很简单:

boolean equals(Object o) {
    if(o == null)  {            
        return false;        
    }        
    if (o == this)  {           
        return true;        
    }        
    if (getClass() != o.getClass()) {            
        return false;        
    }        
    ObjectM m = (ObjectM) o;        
    return (this.id == m.id);
}

光是写equals()方法还不行,我们还得重写hashCode()方法,我们先看看hashCode()方法:
hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号

public int hashCode() {    
    final int PRIME = 31;    
    int result = 1;    
    result = PRIME * result + getId();    
    return result; 
}

注意事项:
尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。在我们的案例中,我们使用id。
eqauls方法必须保证一致(如果对象没有被修改,equals应该返回相同的值)
任何时候只要a.equals(b),那么a.hashCode()必须和b.hashCode()相等。
两者必须同时重写。

上一篇下一篇

猜你喜欢

热点阅读