==
==比較的是變量(棧)內存中存放的對象的(堆)內存地址蟆技,用來判斷兩個對象的地址是否相同留潦,即是否是指相同一個對象锤悄。比較的是真正意義上的指針操作峦睡。
- 比較的是操作符兩端的操作數(shù)是否是同一個對象翎苫。
- 兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過。
- 比較的是地址赐俗,如果是具體的阿拉伯數(shù)字的比較拉队,值相等則為true。如:
int a=10
與long b=10L
與double c=10.0
都是相同的(為true)阻逮,因為他們都指向地址為10的堆粱快。
equals
equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象事哭,如果沒有對該方法進行覆蓋的話漫雷,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷鳍咱。
String s="abce"
是一種非常特殊的形式降盹,和new
有本質的區(qū)別。它是java中唯一不需要new就可以產生對象的途徑谤辜。以String s="abce";
形式賦值在java中叫直接量蓄坏,它是在常量池中而不是像new一樣放在壓縮堆中。這種形式的字符串丑念,在JVM內部發(fā)生字符串拘留涡戳,即當聲明這樣的一個字符串后,JVM會在常量池中先查找有沒有一個值為"abcd"的對象脯倚,如果有趋惨,就會把它賦給當前引用爬坑,即原來那個引用和現(xiàn)在這個引用指向了同一對象,如果沒有昔瞧,則在常量池中新創(chuàng)建一個"abcd"千扔,下一次如果有String s1 = "abcd";
又會將s1指向"abcd"這個對象琼稻,即以這種形式聲明的字符串幻馁,只要值相等庇配,任何多個引用都指向同一對象。
而String s = new String("abcd");
和其它任何對象一樣尊残,每調用一次就產生一個對象产园,只要它們調用。
也可以這么理解:String str = "hello";
先在內存中找是不是有"hello"這個對象夜郁,如果有,就讓str指向那個"hello"粘勒。如果內存里沒有"hello"竞端,就創(chuàng)建一個新的對象保存"hello"。String str=new String("hello")
就是不管內存里是不是已經有"hello"這個對象庙睡,都新建一個對象保存"hello"事富。
具體可以看下面的代碼:
public class EqualsTest {
public static void main(String[] args) {
String a = new String("ab"); // a為一個引用
String b = new String("ab"); // b為另一個引用,對象的內容一樣
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
System.out.println("aEQb");
}
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
equals和==的區(qū)別
equals方法最初是在所有類的基類Object中進行定義的乘陪,源碼是:
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源碼可以看出這里定義的equals與==是等效的(Object類中的equals沒什么區(qū)別)统台,不同的原因就在于有些類(像String、Integer等類)對equals進行了重寫啡邑,但是沒有對equals進行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法贱勃,其equals方法與==就也是等效的,除非我們在此類中重寫equals。
對equals重新需要注意五點:
- 自反性:對任意引用值x贵扰,x.equals(x)的返回值一定為true仇穗;
- 對稱性:對于任何引用值x和y,當且僅當y.equals(x)返回值為true時戚绕,x.equals(y)的返回值一定為true纹坐;
- 傳遞性:如果x.equals(y)=true,y.equals(z)=true舞丛,則x.equals(z)=true耘子;
- 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變球切;
- 非空性:任何非空的引用值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 = 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;
}
另外欧聘,"=="比"equals"運行速度快,因為"=="只是比較引用片林。