美文网首页Android知识
设计重写equals()和hashCode()

设计重写equals()和hashCode()

作者: 冯奕欢 | 来源:发表于2016-07-01 10:26 被阅读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()相等。
    两者必须同时重写。

    相关文章

      网友评论

        本文标题:设计重写equals()和hashCode()

        本文链接:https://www.haomeiwen.com/subject/psmfjttx.html