equals方法
equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法體如下:
public boolean equals(Object obj) {
return (this == obj);
}
很顯然,在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。但是有些朋友又會有疑問了,為什么下面一段代碼的輸出結果是true?
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2));
要知道究竟,可以看一下String類重寫的equals方法的具體實現,其中value是一個字符數組,如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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;
}
==操作符
1、對於==,如果作用於基本數據類型的變量,則直接比較其存儲的 "值"是否相等。int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。
2、如果作用於引用類型的變量,則比較的是所指向的對象的地址。
探索String str="abc"和String str=new String()區別
String s="abc"是一種非常特殊的形式,和new有本質的區別。它是java中唯一不需要new就可以產生對象的途徑。以String s="abc",形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字符串,在JVM內部發生字符串拘留,即當聲明這樣的一個字符串后,JVM會在常量池中先查找有有沒有一個值為"abc"的對象,如果有,就會把它賦給當前引用。即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新創建一個"abc",下一次如果有String s1 = "abc",又會將s1指向"abc"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一象。