重寫equals()和hashCode()

何時須要重寫equals()?
ide

只有當一個實例等於它自己的時候,equals()纔會返回true值。通俗地說,此時比較的是兩個引用是否指向內存中的同一個對象,也能夠稱作是否實例相 等。而咱們在使用equals()來比較兩個指向值對象的引用的時候,每每但願知道它們邏輯上是否相等,而不是它們是否指向同一個對象。在這樣的狀況下, 若是超類也沒有重寫equals()以實現指望的行爲,這時咱們就須要重寫equals方法。this

下面看一個簡單示例,咱們須要一系列的orderElement對象,可是當propertyName已經有的狀況下,咱們就不在須要,那麼其實咱們在比較兩個對象的時候只須要知道他們的property值是否相等就能夠了:spa

 

 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 }

 

這個應用很是經常使用,有須要的話咱們都應該在本身的類中重寫這兩個方法!code

相關文章
相關標籤/搜索