==
用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是棧內存中存放的對象的堆內存地址。
操作符兩端的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
- 比較基本數據類型:如果兩個值相同,則結果爲true
- 比較引用:如果引用指向內存中的同一對象,結果爲true
代碼所示,他們都指向地址爲10的堆。
public class Test {
public static void main(String[] args) {
int a = 10;
long b = 10L;
double c = 10.0;
System.out.println(a == b); // true
System.out.println(a == c); // true
System.out.println(b == c); // true
}
}
equals
-
equals用來比較的是兩個對象的內容是否相等:如果兩個對象的類型一致,並且內容一致,則返回true,
-
由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象
-
若未對該方法進行覆蓋重寫,調用的仍然是Object類中的方法,返回的是
==
的判斷
equals方法是在所有類的基類Object中進行定義的,源碼:
public boolean equals(Object obj) {
return (this == obj);
}
特殊
String s = "aaa";
- 它是java中唯一不需要new 就可以產生對象的途徑.
- 形式賦值在java中叫直接量,是在常量池中而不是象new一樣放在堆中。
- 這種形式的字符串,在JVM內部發生字符串拘留
- 即當聲明這樣的一個字符串後,JVM會在常量池中先查找有有沒有一個值爲"aaa"的對象,如果有,就會把它賦給當前引用。
- 即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新創建一個"aaa".
- 只要值相等,任何多個引用都指向同一對象
String類重寫了equals方法
源碼:
public boolean equals(Object anObject) {
2 if (this == anObject) {
3 return true;
4 }
5 if (anObject instanceof String) {
6 String anotherString = (String)anObject;
7 int n = count;
8 if (n == anotherString.count) {
9 char v1[] = value;
10 char v2[] = anotherString.value;
11 int i = offset;
12 int j = anotherString.offset;
13 while (n-- != 0) {
14 if (v1[i++] != v2[j++])
15 return false;
16 }
17 return true;
18 }
19 }
20 return false;
21 }
hashCode
hash是一個函數,該函數中的實現就是一種算法,就是通過一系列的算法來得到一個hash值
通過hash算法得到的hash值就在hash表中,也就是說,hash表就是所有的hash值組成的
有很多種hash函數,也就代表着有很多種算法得到hash值。
hashcode就是在hash表中有對應的位置。
hashcode代表對象的地址說的是對象在hash表中的位置,物理地址說的對象存放在內存中的地址
默認情況下,Object中的hashCode() 返回對象的jvm
地址。
- 如果兩個對象equals相等,那麼這兩個對象的HashCode一定也相同
- 如果兩個對象的HashCode相同,不代表兩個對象就相同,只能說明這兩個對象在散列存儲結構中,存放於同一個位置。
String類中重寫 了hashCode方法
源碼:(點擊跳轉源碼解析)
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}