在java中:
== 是運算符,用于比較兩個變量是否相等。
-
equals 是Objec類的方法,用于比較兩個對象是否相等,默認Object類的equals方法是比較兩個對象的地址,跟==的結果一樣。Object的equals方法如下:
public boolean equals(Object obj) { return (this == obj); } hashCode 也是Object類的一個方法。返回一個離散的int型整數(shù)。在集合類操作中使用,為了提高查詢速度。(如HashMap,HashSet等)
下面我們分別再介紹:
==
Java中的數(shù)據(jù)類型分為兩類:
- 基本數(shù)據(jù)類型,也稱原始數(shù)據(jù)類型。
- byte,short,char,int,long,float,double,boolean 一共八種。他們之間的比較,應用雙等號(==),比較的是他們的值。
- 復合數(shù)據(jù)類型(類)。
- 當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址。所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果都是false。
equals()
JAVA當中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現(xiàn),而不再是比較類在堆內存中的存放地址了,而是比較他們的值。
//String的equals()源碼
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}//重寫了Object的equals方法,判斷字符串內容
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
對于復合數(shù)據(jù)類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基于他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較后的結果跟雙等號(==)的結果相同。
hashCode()
如果兩個對象根據(jù)equals()方法比較是相等的,那么調用這兩個對象中任意一個對象的hashCode方法都一定產(chǎn)生同樣的整數(shù)結果。如果兩個對象根據(jù)equals()方法比較是不相等的,那么調用這兩個對象中任意一個對象的hashCode方法,則不一定要產(chǎn)生相同的整數(shù)結果。
從而在集合操作的時候有如下規(guī)則:
將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該對象放入集合中。 如果hashcode值相等,然后再通過equals方法判斷要放入對象與集合中的任意一個對象是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。
希望可以幫到你~