1. 程式人生 > >==和equals的區別小結?

==和equals的區別小結?

解釋一下 ”==”,他比較的是一個物件在記憶體中的地址值, 比如2個字串物件 String s1 = new String("str"); String s2 = new String("str"); 如果用==號比較,會返回false,因為建立了兩個物件,他們在記憶體中地址的位置是不一樣的。 equals的情況比較複雜,它是java.lang.Object類中的一個方法。因為java中所有的類都預設繼承於Object,所以所有的類都有這個方法。 在Object類原始碼中是這樣寫的。 public boolean equals(Object obj) { return (this == obj); }

分析一下:

String a = "ab";

String b = "ab";

a == b ,結果為true。

String s="ab"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生物件的途徑。以String a="ab";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字串,在JVM內部發生字串拘留,即當宣告這樣的一個字串後,JVM會在常量池中先查詢有有沒有一個值為"ab"的物件,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一物件,如果沒有,則在常量池中新建立一個"abcd",下一次如果有String a1 = "ab";又會將a1指向"ab"這個物件,即以這形式宣告的字串,只要值相等,任何多個引用都指向同一物件.

他同樣使用==號進行記憶體地址的比較。但是許多java類中都重寫了這個方法,比如String。 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; } String裡的方法,如果==號比較不相等,還會進行一下值的比較。 所以equals方法具體的作用要看當前的那個類是如何實現重寫父類中該方法的。如果沒有重寫該方法,那麼他和==號等價。