加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java中重写Object类的equals方法和Hashcode方法的谨慎事项

发布时间:2021-12-14 21:16:53 所属栏目:PHP教程 来源:互联网
导读:在重写任何类的equals方法是必须遵循以下几点: 1、对称性:如果x.equals(y)返回是true,那么y.equals(x)也应该返回是true。 2、反射性:x.equals(x)必须返回是true。 3、类推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也应
在重写任何类的equals方法是必须遵循以下几点:
 
1、对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
 
2、反射性:x.equals(x)必须返回是“true”。
 
3、类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
 
4、还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
 
5、任何情况下,x.equals(null),永远返回是“false”;
 
在重写任何类得hashcode方法是必须遵循以下几点:
 
1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的Hashcode值可以相同,也有可能不同。
 
2、对于两个对象来说,如果他们的equals方法比较返回true,那么这两个对象的hashcode必然相同。这也解释了为什么String类中,如果两个对象的equals方法相同,则他们的hashcode值一定相同。
 
3、对于两个对象来说,如果使用equals方法返回为false,则他们的hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用判断equals方法了)
 
4、对于Object对象来说,不同的Object对象的hashcode是不同的,它们返回的是对象的地址,equals返回的也是对象的地址。所以在自己定义的类中如果要添加到集合对象中,最好是要重写hashcode和equals方法,不然会自动继承自Object类中的两个方法根据对象地址来判断。在重写自己定义的类时,通常是在类中的根据某个值如name.hashcode();来进行判断。
 
以HashSet 为例,
 
当我们使用HashSet时,hashCode()方法就会被得到调用,判断已经存储在集合中的对象的hashCode值是否与所增加
 
对象的hashCode值一致,如果“不一致”则直接加进去(不用比较equals()提高效率),如果一致,则进行equals方法的比较,如果返回true,表明 集合里面已经有这个对象,不能添加进去了。如果是false表是集合里面没有这个对象,则可以加进去。所以我们在重写hashcode()或者equals() 方法的任何一个方法时,必须重写另外一个。 自己手工写了一个类来重写这两个方法:
 
/**
 *  
 * People 手工重写hashcode方法和equals方法 根据name来判断 两个对象是否相等。 2011-7-12 上午09:09:56
 *  
 * @version 1.0.0
 *  
 */
class People {
    private String name;
 
    public People(String name) {
        this.name = name;
    }
 
    @Override
    public boolean equals(Object obj) {
 
        // TODO Auto-generated method stub  
        //如果是自己  
        if(this==obj){
            return true ;
 
        }
        //如果是空  
        if(obj==null ){
            return false;
        }
        //比较两个People的名字是否相同  
        if(obj!=null && obj instanceof People){
            if(((People)obj).name.equals(this.name))
                return  true ;
 
        }
        return false;
 
    }
 
    @Override
    public int hashCode() {
 
        // TODO Auto-generated method stub  
        // String的hashcode本来就是用来比较两个字符是否相等  
        return name.hashCode();
 
    }
 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读