== 在比較基本資料類型時比較的是值,而用==号比較兩個對象時比較的是兩個對象的位址值:(== 比較的是變量(棧)記憶體中存放的對象的(堆)記憶體位址,用來判斷兩個對象的位址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作);
Object類中equals方法源代碼:
- public boolean equals(Object obj)
- {
- return this == obj;
- }
equals()方法存在于Object類中,因為Object類是所有類的直接或間接父類,也就是說所有的類中的equals()方法都繼承自Object類,而通過源碼我們發現,Object類中equals()方法底層依賴的是==号,那麼,在所有沒有重寫equals()方法的類中,調用equals()方法其實和使用==号的效果一樣,也是比較的位址值,然而,Java提供的所有類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法一般都是比較兩個對象的值:
String s = "abce" 是一種非常特殊的形式,和new 有本質的差別。它是java中唯一不需要new 就可以産生對象的途徑。以String s="abce";形式指派在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字元串,在JVM内部發生字元串拘留,即當聲明這樣的一個字元串後,JVM會在常量池中先查找有有沒有一個值為"abcd"的對象,如果有,就會把它賦給目前引用.即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新建立一個"abcd",下一次如果有String s1 = "abcd";又會将s1指向"abcd"這個對象,即以這形式聲明的字元串,隻要值相等,任何多個引用都指向同一對象.
而String s = new String("abcd");和其它任何對象一樣.每調用一次就産生一個對象,隻要它們調用。也可以這麼了解: String str = "hello"; 先在記憶體中找是不是有"hello"這個對象,如果有,就讓str指向那個"hello".如果記憶體裡沒有"hello",就建立一個新的對象儲存"hello". String str=new String ("hello") 就是不管記憶體裡是不是已經有"hello"這個對象,都建立一個對象儲存"hello"。
具體可以看下面的代碼:
1 public class test1 {
2 public static void main(String[] args) {
3 String a = new String("ab"); // a 為一個引用
4 String b = new String("ab"); // b為另一個引用,對象的内容一樣
5 String aa = "ab"; // 放在常量池中
6 String bb = "ab"; // 從常量池中查找
7 if (aa == bb) // true
8 System.out.println("aa==bb");
9 if (a == b) // false,非同一對象
10 System.out.println("a==b");
11 if (a.equals(b)) // true
12 System.out.println("aEQb");
13 if (42 == 42.0) { // true
14 System.out.println("true");
15 }
16 }
17 }
equals和==的差別
由equals的源碼可以看出這裡定義的equals與==是等效的(Object類中的equals沒什麼差別),不同的原因就在于有些類(像String、Integer等類)對equals進行了重寫,但是沒有對equals進行重寫的類(比如我們自己寫的類)就隻能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非我們在此類中重寫equals。
對equals重新需要注意五點:
1 自反性:對任意引用值X,x.equals(x)的傳回值一定為true;
2 對稱性:對于任何引用值x,y,當且僅當y.equals(x)傳回值為true時,x.equals(y)的傳回值一定為true;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true ;
4 一緻性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變;
5 非空性:任何非空的引用值X,x.equals(null)的傳回值一定為false 。
String類對equals的重寫如下:
1 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 }
另外,"=="比"equals"運作速度快,因為"=="隻是比較引用。