暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

每日一学之Java开发技巧(三)覆写toString、equals、hashCode方法

程序员的日记本 2017-12-28
246


Object类


Object类是Java中所有类的终极父类。注意,这里不包括接口,Object不能作为接口的父类。因此所有非final的方法都可以被重写,今天就说一说toString、equals、hashCode 三个方法的重写。


覆写toString方法


创建User类

public class User {
    private String name;
    private String age;
    private String sex;
    public User(String name,String age ,String sex){       
        this.name = name;    
        this.age = age;    
        this.sex = sex;    } }

打印当前User

User u1 = new User("小明" , "14" , "男");
System.out.println(u1);

执行结果为:test.User@13887c2

覆写toString

@Override
public String toString() {     
   return
"name: "+this.name + "   age: "+this.age +"   sex: "+this.sex; }

执行结果为:name: 小明   age: 14   sex: 男


覆写toString函数对开发中判断传递的对象数据非常实用


覆写equals方法


调用Object.equals比较

User u1 = new User("小明" , "14" , "男");
User u2 = new User("小明" , "14" , "男");
System.out.println(u1.equals(u2));
执行结果为:false

覆写equals

@Override
public boolean equals(Object obj) {        
   if(this == obj) return true;        
   if
(obj == null) return false;  
   if (obj instanceof User) {          
        return this.name.equals(((User)obj).name)
            && this.age.equals(((User)obj).age)
            && this.sex.equals(((User)obj).sex);    }        
   return
false; }
    
执行结果: true     

覆写equals对实现实际项目的业务非常有帮助,例如匹配两条数据是否为同一目标


复写hashCode方法


Object类在实现该方法时,返回值为对象的地址。这与equals方法的实现有关。因此,当重写equals方法后一定要重写hashCode。在只重写了equals方法未重写hashCode方法时执行下面的代码,大家应该可以发现两个对象即使你的equals相等,但是两个对象的hashCode确不会相等。

User u1 = new User("小明" , "14" , "男");
User u2 = new User("小明" , "14" , "男");
System.out.println(u1.hashCode() +" "+u2.hashCode());

当你的equals相等的时候,要求你的hashCode返回相同的值。

在覆写hashCode方法时,一般遵循以下几步


  • 声明一个int型的变量,命名为result(或者其他你喜欢的名字),然后初始化为一个不为零的常量(比如31)

  • 对每一个对象中有意义的具体值(在equals()中所涉及的值)进行hash计算并合并(hc)

  • 返回7(任意值)*result + hc


覆写hashCode方法

@Override
public int hashCode(){
   int result = 31;
   result = 7*result+name.hashCode() + sex.hashCode() + age.hashCode();        
  return
result; }

为什么要同时重写equasl与hashCode


下面使用set为大家讲讲为什么在重写equals同时需要重写hashCode。


首先我们在重写equals的前提下,将两个相同的对象加入hashSet,大家都知道set的特性只存不同的对象。

HashSet hset = new HashSet();
User u1 = new User("小明" , "14" , "男");
User u2 = new User("小明" , "14" , "男");
hset.add(u1);
hset.add(u2);
System.out.println(hset.size());
执行结果:2

通过执行后发现,明明equals相同的对象确都可以被加入到set中。


再重写hashCode,并执行上面的代码

执行结果:1

为了避免上述错误,一定要记住在重写equals的同时要重写hashCode


下期提要


下期将介绍Object的另一半内容,克隆与序列化。敬请期待!





长按,识别二维码,加关注,

可了解更多编程方面的知识,

让你看到每天一点点的进步。

谢谢点赞 + 分享!!!!!!


不积跬步,无以至千里;

不积小流,无以成江海。

文章转载自程序员的日记本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论