重写equals()方法和 hashCode()方法

Posted kkkore

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写equals()方法和 hashCode()方法相关的知识,希望对你有一定的参考价值。

java中判断两个对象是否相等的规则:
首先,判断两个对象的hashCode是否相等 
如果不相等,认为两个对象也不相等 
如果相等,则判断两个对象用equals运算是否相等 
如果不相等,认为两个对象也不相等 
如果相等,认为两个对象相等 

我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率。

equals()相等的两个对象,hashcode()一定相等; 
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。

1,所有Java类都继承自Object类
2,Object类中有
public int hashCode(){}
public boolean equals(Object obj){}
这两个方法及其他的方法。
在Object类中,equls()方法和==的本质是相同的,都是判断两个引用是否指向同一对象。
String类继承自Object类:但String类重写了equals()方法,
使得:equals()方法的作用是比较两个字符串的内容是否相等;
==的作用是比较两个引用是否指向同一个对象;
很多类都重写了equals方法,供自己产生新的定义。
3,在本程序中:Items类继承自Object类,并且重写了equals()方法,不按照父类的比较方法来比较两个对象,使得该方法能够按照程序员自己的意愿来比较两个对象

@Items.java//解决编号没有合并问题
@Override
public int hashCode() {
    //若getId和getName相同,则hashCode一定相同
    return this.getId()+this.getName().hashCode();
}

@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    if(this==obj)
    {
        return true;
    }
    if(obj instanceof Items)
    {
        Items i = (Items)obj;
        if(this.getId()==i.getId()&&this.getName().equals(i.getName()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}                            

 

以上是关于重写equals()方法和 hashCode()方法的主要内容,如果未能解决你的问题,请参考以下文章

java 集合中重写hashCode方法和重写equals方法啥关系?

重写了equals方法为何需要重写 hashCode

【彻底理解】 为啥重写equals()方法为啥要重写hashCode()方法

关于equals与hashcode的重写

为什么要重写equals和hashcode方法

hashcode和equals方法