重写equals()和hashCode()

Posted user_孙

tags:

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

什么时候需要重写equals()?

只有当一个实例等于它本身的时候,equals()才会返回true值。通俗地说,此时比较的是两个引用是否指向内存中的同一个对象,也可以称做是否实例相 等。而我们在使用equals()来比较两个指向值对象的引用的时候,往往希望知道它们逻辑上是否相等,而不是它们是否指向同一个对象。在这样的情况下, 如果超类也没有重写equals()以实现期望的行为,这时我们就需要重写equals方法。

下面看一个简单示例,我们需要一系列的orderElement对象,但是当propertyName已经有的情况下,我们就不在需要,那么其实我们在比较两个对象的时候只需要知道他们的property值是否相等就可以了:

 

 1 public class OrderElement {
 2 
 3     public OrderElement() {
 4     }
 5 
 6     public OrderElement(Integer orderNo, String propertyName, boolean isAsc) {
 7         this.orderNo = orderNo;
 8         this.propertyName = propertyName;
 9         this.isAsc = isAsc;
10     }
11 
12     private Integer orderNo;
13     private String propertyName;// 排序属性
14     private boolean isAsc;// 是否正序
15 
16     public Integer getOrderNo() {
17         return orderNo;
18     }
19 
20     public void setOrderNo(Integer orderNo) {
21         this.orderNo = orderNo;
22     }
23 
24     public String getPropertyName() {
25         return this.propertyName;
26     }
27 
28     public void setPropertyName(String propertyName) {
29         this.propertyName = propertyName;
30     }
31 
32     public boolean getIsAsc() {
33         return this.isAsc;
34     }
35 
36     public void setAsc(boolean isAsc) {
37         this.isAsc = isAsc;
38     }
39 
40     @Override
41     public boolean equals(Object obj) {
42         if (obj == null || !this.getClass().getName().equals(obj.getClass().getName()))
43             return false;
44         OrderElement e = OrderElement.class.cast(obj);
45         if (getPropertyName() != null && e.getPropertyName() != null && getPropertyName().equals(e.getPropertyName()))
46             return true;
47         return super.equals(obj);
48     }
49 
50     @Override
51     public int hashCode() {
52         if (getPropertyName() != null) {
53             return getPropertyName().hashCode();
54         }
55         return super.hashCode();
56     }
57 }

 

这个应用非常常用,有需要的话我们都应该在自己的类中重写这两个方法!

 

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

重写hashcode和equals怎么重写

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

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

在java中,关于equals(),和hashCode()的重写问题。

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

Java的hashCode和equals方法