面試時被問到了equal和hashcode的區別,在這裡總結一下:
equals
是根類obeject
中的方法。源**如下:
public boolean equals(object obj)
可見預設的
equals
方法,直接呼叫
==,比較物件位址。
不同的子類,可以重寫此方法,進行兩個物件的
equals
的判斷。
string
類原始碼中重寫的
equals
方法如下:
public boolean equals(object anobject)
if (anobject instanceof string)
return true;}}
return false;
}
從上面的**中可以看到,
(1)string
類中的equals
首先比較位址,如果是同乙個物件的引用,可知物件相等,返回
true。
(2)如果不是同乙個物件,
equals
方法挨個比較兩個字串物件內的字元,只有完全相等才返回
true
,否則返回
false。
hashcode
是根類obeject
中的方法。
預設情況下,
object
中的hashcode()
返回物件的32位
jvm記憶體位址。也就是說如果物件不重寫該方法,則返回相應物件的32為
jvm記憶體位址。
string
類原始碼中重寫的
hashcode
方法如下:
public int hashcode()
hash = h;
}return h;
}
string
原始碼中使用
private final char value;
儲存字串內容,因此
string
是不可變的。
看下面的例子,沒有重寫
hashcode
方法的類,直接返回
32位物件在
jvm中的位址;
long
類重寫了
hashcode
方法,返回計算出的
hashcode
數值:
public class comhashcode
}
如果兩個物件相等(equal),它們的hashcode一定相同;
如果兩個物件有相同的hashcode,它們不一定相等(equal);
之所以這樣設計是為了在map中更快的查詢到物件(相對於線性搜尋);
一般map都設計成陣列+鍊錶的結構,使用hashcode去查詢物件需要兩個步驟,首先使用hashcode定位陣列下標索引,然後遍歷該陣列元素對應的鍊錶,找到equals的元素;
object預設的hashcode實現對於不同的物件會返回不同的值,值的雜湊就像在車庫儲存貨物,不同的貨物能被存放到不同的車庫。比較有效查詢貨物辦法是將不同的貨物存到不同的車庫中,而不是同乙個車庫;
因此,通過hashcode可以很快的查到小記憶體塊,而且通過hashcode比較比equal方法快,當get時先比較hashcode,如果hashcode不同,直接返回false。
java中 和 equal區別
明確概念 物件的引用 當用類建立乙個物件時,類中的成員變數被分配記憶體空間,這些記憶體空間稱為該物件的實體,而物件中存放著引用 位址 以確保該實體由該物件操作使用。一 比較物件為基本資料型別 byte,short,char,int,long,float,double,boolean 比較兩個基本資料...
java 與equal 的區別
判定的是物件的等價性,必須是實實在在地是同乙個物件才返回true。判定基本型的值是否相等。int i1 47 int i2 47 system.out.println i1 i2 output true 基本型包裝類 integer n1 new integer 47 integer n2 new ...
和 equal 的區別
public class equaltest 執行結果為 t1 t2 false t1 t2 t3 true t3 t4 true i1.equals i2 false i3.equals i1 i2 true i3.equals i4 true st1 st2 false st1 st2 st3 ...