歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中重寫Object類的equals方法和Hashcode方法的注意事項

在重寫任何類的equals方法是必須遵循以下幾點:

1、對稱性:如果x.equals(y)返回是“true”,那麼y.equals(x)也應該返回是“true”。

2、反射性:x.equals(x)必須返回是“true”。

3、類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那麼z.equals(x)也應該返回是“true”。

4、還有一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。

5、任何情況下,x.equals(null),永遠返回是“false”;

在重寫任何類得hashcode方法是必須遵循以下幾點:

1、在Java應用的同一次執行過程中,同一對象被多次調用,則他們的hashcode值必然相同。而對於同一個應用的兩次不同的調用,它們的Hashcode值可以相同,也有可能不同。

2、對於兩個對象來說,如果他們的equals方法比較返回true,那麼這兩個對象的hashcode必然相同。這也解釋了為什麼String類中,如果兩個對象的equals方法相同,則他們的hashcode值一定相同。

3、對於兩個對象來說,如果使用equals方法返回為false,則他們的hashcode的值有可能相等也可能不等,(如果不同會提高性能,因為在集合中類判斷兩個對象是否相等,如果其hashcode不等就直接不用判斷equals方法了)

4、對於Object對象來說,不同的Object對象的hashcode是不同的,它們返回的是對象的地址,equals返回的也是對象的地址。所以在自己定義的類中如果要添加到集合對象中,最好是要重寫hashcode和equals方法,不然會自動繼承自Object類中的兩個方法根據對象地址來判斷。在重寫自己定義的類時,通常是在類中的根據某個值如name.hashcode();來進行判斷。

以HashSet 為例,

當我們使用HashSet時,hashCode()方法就會被得到調用,判斷已經存儲在集合中的對象的hashCode值是否與所增加

對象的hashCode值一致,如果“不一致”則直接加進去(不用比較equals()提高效率),如果一致,則進行equals方法的比較,如果返回true,表明 集合裡面已經有這個對象,不能添加進去了。如果是false表是集合裡面沒有這個對象,則可以加進去。所以我們在重寫hashcode()或者equals() 方法的任何一個方法時,必須重寫另外一個。 自己手工寫了一個類來重寫這兩個方法:

  1. /** 
  2.  *  
  3.  * People 手工重寫hashcode方法和equals方法 根據name來判斷 兩個對象是否相等。 2011-7-12 上午09:09:56 
  4.  *  
  5.  * @version 1.0.0 
  6.  *  
  7.  */ 
  8. class People { 
  9.     private String name; 
  10.  
  11.     public People(String name) { 
  12.         this.name = name; 
  13.     } 
  14.  
  15.     @Override 
  16.     public boolean equals(Object obj) { 
  17.  
  18.         // TODO Auto-generated method stub  
  19.         //如果是自己  
  20.         if(this==obj){ 
  21.             return true ; 
  22.  
  23.         } 
  24.         //如果是空  
  25.         if(obj==null ){ 
  26.             return false
  27.         } 
  28.         //比較兩個People的名字是否相同  
  29.         if(obj!=null && obj instanceof People){ 
  30.             if(((People)obj).name.equals(this.name)) 
  31.                 return  true ; 
  32.  
  33.         } 
  34.         return false
  35.  
  36.     } 
  37.  
  38.     @Override 
  39.     public int hashCode() { 
  40.  
  41.         // TODO Auto-generated method stub  
  42.         // String的hashcode本來就是用來比較兩個字符是否相等  
  43.         return name.hashCode(); 
  44.  
  45.     } 
  46.  
Copyright © Linux教程網 All Rights Reserved