标签:c style class blog code java
什么是equals方法
指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否相等。
Object类中的equals方法
一起来看看Object类中的源代码
public boolean equals(Object obj) { return (this == obj); }
我们可以观察到几点:
实际上为什么要编写equals
在我们的实际的操作中,有下面的例子:
@Test public void whyUseEquals() { User user1 = new User("xujianguo", 21); User user2 = new User("xujianguo", 21); System.out.println(user1.equals(user2)); }
发user1和user2的name都是xujianguo,age都是21的,按照我们的逻辑是同一个人,都是如果没有重写equals方法,默认采用Object的equals方法的话,结果就是false的,所以我们必须实现equals来实现我们的逻辑。
高质量equals方法
1.使用instanceof操作符检查参数是否为正确的类型
因为equals的参数为Object,你的类是Person,但是这个参数很可能不是Person类型的,可能是User类型的,这样的话就不符合你的判断的,使用instanceof可以判断你的参数是否为正确的你要的处理的类型。
@Override public boolean equals(Object object) { if(!(object instanceof Person)) { return false; } else { //... return true; } }
2.把参数转化为正确的类型
在前面进行了类型的判断后,就需要进行类型的转换,转换成需要的类型我们才能进行后续的操作。
@Override public boolean equals(Object object) { if(!(object instanceof Person)) { return false; } else { Person person = (Person)object; //... return true; } }
3.匹配参数中的域情况
这里就是你的逻辑的实现,你的两个对象要怎么样才相等,对于我的这个Person类来说,name一样并且age一样,两个就相等了。
@Override public boolean equals(Object object) { if(!(object instanceof Person)) { return false; } else { Person person = (Person)object; if(person.getName().equals(name) && person.getAge() == age) { return true; } else { return true; } } }
4.编写完成equals方法后,检查其三大特性:自反性、对称性、传递性
高质量的equals方法必须满足这三大特性
标签:c style class blog code java
原文地址:http://www.cnblogs.com/rayguo/p/3777692.html