equals()和hashCode()的區別
1、為什麼要過載equal方法?
當註釋掉hashCode()或者equals()任意一個時,都得不到結果!
答案:因為Object的equal方法預設是兩個物件的引用的比較,意思就是指向同一記憶體,地址則相等,否則不相等(跟==是一個意思);如果你現在需要利用物件裡面的值來判斷是否相等,則過載equal方法。
特別注意:String重寫了equals方法,是按照其字串的值來比較的
2、 為什麼過載hashCode方法?
答案:一般的地方不需要過載hashCode(hashCode預設是取物件的地址來做運算),只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會過載hashCode,因為這需要大量的比較操作,用equals會花費大量時間,而用hashcode則會大大節省時間
這種Hash比較演算法是這樣操作的:
<1>、 通過hashCode查到小記憶體塊的地址,如果hashCode不同,直接返回false(表明這兩物件不相等),若相同,則進行第二步;
<2>、通過equals方法(可能是重寫過的)來比較兩物件,若相等,則表明兩物件相等;若不等,則表示不相等
3、例子
<span style="font-size:14px;">import java.util.HashMap;
import java.util.Map;
public final class TestEqualHashcode {
public static void main(String[] args) {
Map m = new HashMap();
m.put(new PhoneNumber(020, 12345678), "shellfeng");
System.out.println(m.get(new PhoneNumber(020, 12345678)));
}
private static class PhoneNumber {
private short areaCode;
private short extension;
public PhoneNumber(int areaCode, int extension) {
this.areaCode = (short) areaCode;
this.extension = (short) extension;
}
public boolean equals(Object o) {
if (o == this) {//若物件是其本身,則返回true
return true;
}
if (!(o instanceof PhoneNumber)) {
return false;
}
PhoneNumber pn = (PhoneNumber) o;
return pn.extension == extension && pn.areaCode == areaCode;
}
public int hashCode() {
int result = 17;
result = 32 * result + areaCode;
result = 32 * result + extension;
return result;
}
}
}</span>
當註釋掉hashCode()或者equals()任意一個時,都得不到結果!
相關文章
- hashCode()和equals()的區別?(skycto JEEditor)
- Java基礎- ==和equals和hashCode的區別Java
- 程式設計師必須搞清的概念equals和=和hashcode的區別程式設計師
- 【Java】equals 和 == 的區別Java
- ==和equals方法的區別
- String的equals和hashCode方法
- equals & hashCode
- 搞懂 Java equals 和 hashCode 方法Java
- java~重寫hashcode和equalsJava
- java 中equals和==的區別Java
- Java中equals和==的區別Java
- equals和equalsIgnoreCase的區別
- equals&hashCode
- hashCode()與equals()
- JAVA基礎(一)equals和==和hashCodeJava
- 細說equals()方法和hashCode()方法
- 詳解equals()方法和hashCode()方法
- 自動生成hashcode和equals方法
- Java中 equals() 方法和 == 的區別Java
- 深入理解equals和==的區別
- 【ASP.net】Equals 和 == 的區別ASP.NET
- 在java中“equals”和“==”的區別Java
- 關於重寫equals()和hashCode()的思考
- "a".equals(b)和b.equals("a")有什麼區別
- ==、equals、hashcode總結
- Object類-equals()、==、hashCode()Object
- 你真的知道 == 和 equals 的區別嗎?
- 你真的懂 == 和 equals 的區別嗎?
- Java基礎系列-equals方法和hashCode方法Java
- Java中hashcode和equals效能注意點 - ShaiJavaAI
- 第四章 ==和equals()的區別
- Java經典面試題: == 和 equals( )的區別Java面試題
- 關於equals()和hashcode()的一些約定
- 『Java 語法基礎』對 equals() 和 hashCode() 的理解Java
- “==”、“equals()”、“hashcode()”之間的祕密
- Hashcode相同但是equals不同的例子
- javaSE中的==和equals的聯絡與區別Java
- 關於HashMap的key重寫hashcode和equals的理解HashMap