
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的另一半内容,克隆与序列化。敬请期待!
长按,识别二维码,加关注,
可了解更多编程方面的知识,
让你看到每天一点点的进步。
谢谢点赞 + 分享!!!!!!

不积跬步,无以至千里;
不积小流,无以成江海。






