Java中hashCode¥equals¥==的區別
阿新 • • 發佈:2018-04-13
類重寫 對象 相同 判斷 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¥==的區別