==
== 比較的是變量(棧)內(nèi)存中存放的對象的(堆)內(nèi)存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象叶圃。比較的是真正意義上的指針操作。
1践图、比較的是操作符兩端的操作數(shù)是否是同一個對象掺冠。
2、兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過码党。
3德崭、比較的是地址,如果是具體的阿拉伯?dāng)?shù)字的比較揖盘,值相等則為true眉厨,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因?yàn)樗麄兌贾赶虻刂窞?0的堆兽狭。
equals
equals用來比較的是兩個對象的內(nèi)容是否相等憾股,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象箕慧,如果沒有對該方法進(jìn)行覆蓋的話服球,調(diào)用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷销钝。
??String s="abcd"是一種非常特殊的形式,和new 有本質(zhì)的區(qū)別有咨。它是java中唯一不需要new 就可以產(chǎn)生對象的途徑琐簇。以String s="abcd";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中蒸健。這種形式的字符串,在JVM內(nèi)部發(fā)生字符串拘留婉商,即當(dāng)聲明這樣的一個字符串后似忧,JVM會在常量池中先查找有有沒有一個值為"abcd"的對象,如果有,就會把它賦給當(dāng)前引用.即原來那個引用和現(xiàn)在這個引用指點(diǎn)向了同一對象,如果沒有,則在常量池中新創(chuàng)建一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一對象。
??而String s = new String("abcd");和其它任何對象一樣.每調(diào)用一次就產(chǎn)生一個對象丈秩,只要它們調(diào)用盯捌。
??也可以這么理解: String str = "hello"; 先在內(nèi)存中找是不是有"hello"這個對象,如果有,就讓str指向那個"hello".如果內(nèi)存里沒有"hello"蘑秽,就創(chuàng)建一個新的對象保存"hello". String str=new String ("hello") 就是不管內(nèi)存里是不是已經(jīng)有"hello"這個對象饺著,都新建一個對象保存"hello"。
public class test{
public static void main(String[] args) {
String a = new String("ab"); // a 為一個引用
String b = new String("ab"); // b為另一個引用,對象的內(nèi)容一樣
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 從常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false肠牲,非同一對象
System.out.println("a==b");
if (a.equals(b)) // true,String重寫了equals方法幼衰,如果沒有重寫這里就是false,因?yàn)楸容^的實(shí)質(zhì)是在比較==
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
equals和==的區(qū)別
equals方法最初是在所有類的基類Object中進(jìn)行定義的缀雳,源碼是
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源碼可以看出這里定義的equals與==是等效的(Object類中的equals沒什么區(qū)別)渡嚣,不同的原因就在于有些類(像String、Integer等類)對equals進(jìn)行了重寫,但是沒有對equals進(jìn)行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法识椰,其equals方法與==就也是等效的绝葡,除非我們在此類中重寫equals。
對equals重新需要注意五點(diǎn):
1 自反性:對任意引用值X腹鹉,x.equals(x)的返回值一定為true藏畅;
2 對稱性:對于任何引用值x,y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時,x.equals(y)的返回值一定為true种蘸;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true 墓赴;
4 一致性:如果參與比較的對象沒任何改變,則對象比較的結(jié)果也不應(yīng)該有任何改變航瞭;
5 非空性:任何非空的引用值X诫硕,x.equals(null)的返回值一定為false 。
String類對equals的重寫如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}