1. 程式人生 > >Java中hashCode¥equals¥==的區別

Java中hashCode¥equals¥==的區別

類重寫 對象 相同 判斷 RR over bool == hashtable

ref:http://www.cnblogs.com/skywang12345/p/3324958.html

1、==作用:

  java中的==用來判斷兩個對象的地址是否相等;當對象是基本數據類型時,可以用來判斷值是否相等;

2、equals():

  Object類中定義的equals()方法, return (this == obj); 通過==來判斷,很多JAVA類重寫了equals方法,java對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";x.equals(和x不同類型的對象)永遠返回是"false"。

  如下:

 @Override
public boolean equals(Object obj){  
        if(obj == null){  
            return false;  
        }  
              
        //如果是同一個對象返回true,反之返回false  
        if(this == obj){  
            return true;  
        }  
              
        //判斷是否類型相同 ,返回對象的運行時類。
        if(this.getClass() != obj.getClass()){  
            return false;  
        }  
              
        Person person = (Person)obj;  
        return name.equals(person.name) && age==person.age;  //調用了String類的equals方法
 }     

3、hashCode():

  1、在用到散列表時,hashCode()方法才需要重寫並發揮作用!

   hashCode():獲取哈希碼,返回一個int類型的整數。當需要將該類放入散列表(如HashMap)時,才需要用到hashCode方法判斷存放地址,在該地址上已存在的對象中用equals去判斷值是否相等。如果跳過hashCode判斷,有可能出現如下情況:存入對象o1與存在對象o2值(屬性值)相同,此時應該用o1替換掉o2,但是由於o1.hashCode()!=o2.hashCode(),(調用的是未重寫的hahsCode方法),散列表在哈希碼對應的地址處沒有元素,則將o1放入該地址。這樣造成了HashMap中存在兩個相同的對象,違背了HashMap的設計原則。

  2、在如HashMap,Hashtable,HashSet等散列表中,equals()方法的重寫需要hashCode()方法的重寫,遵循:

    

(1):若o1.equals(o2)==true,則必須有o1.hashCode()==o2.hashCode(),反之不成立;
(2):若o1.equals(o2)!=true,則hashCode可以相等也可以不等;

  

以上純屬個人理解!

    

       

  

Java中hashCode¥equals¥==的區別