二者的比較有以下一段代碼引出
public class Test {
public String name="abc";
public static void main(String[] args) {
Test test=new Test();
Test testb=new Test();
String a=new String("a");
String b=new String("a");
System.out.println(test.equals(testb));//false
System.out.println(test==testb);//false
System.out.println(test.name.equals(testb.name));//true
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
}
}
Object中equals的源碼如下。
equals和==的比較
基本數(shù)據(jù)類型只需要用==比較值得大小即可蜓堕。
對(duì)于對(duì)象而言抛虏,==用于判斷是不是指向同一個(gè)對(duì)象搏嗡,即內(nèi)存地址的比較牌芋。
而equals() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數(shù)离唐。有以下特點(diǎn)背伴,先看源碼
public boolean equals(Object obj){
return (this==obj);
}
根據(jù)源碼可以看出沸毁,沒有重寫 equals時(shí)峰髓,是直接用==判斷的,所以比較的還是內(nèi)存地址息尺。若想用equals()用來判斷對(duì)象的值是否相等,就要重寫equals()携兵。
例如Person對(duì)象有兩個(gè)屬性,name和age搂誉,若兩個(gè)Person對(duì)象的name和age相同徐紧,那么equals應(yīng)該返回True。
String重寫了equals方法炭懊,比較的數(shù)值內(nèi)容并级。
equals()和hashCode()的聯(lián)系
hashCode()定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數(shù)侮腹。
hashCode()的作用是獲取hash值嘲碧,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)父阻。這個(gè)hash值的作用是確定該對(duì)象在哈希表中的索引位置呀潭。也就是說hash值要在一些數(shù)據(jù)結(jié)構(gòu)中才能顯現(xiàn)作用。hashcode一般用在hashmap至非、hashset里钠署,判斷要把數(shù)據(jù)放在數(shù)組的什么位置。
下面荒椭,我們以HashSet為例谐鼎,來深入說明hashCode()的作用。
假設(shè)趣惠,HashSet中已經(jīng)有1000個(gè)元素狸棍。當(dāng)插入第1001個(gè)元素時(shí),需要怎么處理味悄?因?yàn)镠ashSet是Set集合草戈,它允許有重復(fù)元素。 “將第1001個(gè)元素逐個(gè)的和前面1000個(gè)元素進(jìn)行比較”侍瑟?顯然唐片,這個(gè)效率是相等低下的。散列表很好的解決了這個(gè)問題涨颜,它根據(jù)元素的散列碼計(jì)算出元素在散列表中的位置费韭,然后將元素插入該位置即可。對(duì)于相同的元素庭瑰,自然是只保存了一個(gè)星持。 由此可知,若兩個(gè)對(duì)象相等弹灭,它們的散列碼一定相等督暂;但反過來不一定揪垄。在散列表中,
1逻翁、如果兩個(gè)對(duì)象相等饥努,那么它們的hashCode()值一定要相同。這里的相等是指卢未,通過equals()比較兩個(gè)對(duì)象時(shí)返回true肪凛。
2堰汉、如果兩個(gè)對(duì)象hashCode()相等辽社,它們并不一定相等。
對(duì)于一個(gè)對(duì)象如何求其hash值翘鸭,可以有這樣一個(gè)思路:
1滴铅、對(duì)于對(duì)象中的每個(gè)屬性求其hash值
2、對(duì)每個(gè)屬性的hash值進(jìn)行整合就乓,得到一個(gè)最終的結(jié)果汉匙,即可看作是這個(gè)對(duì)象的hash值。