「請說說 == 和 equals() 的區別?「 相信大傢伙對這句話肯定很熟了,這是一道經典的面試題。
今天這篇文章咱們就來刨析一下其中的區別,首先來了解下這兩個分別是作什麼用的。
分為兩種情況:
1,基礎資料型別中:用於比較兩個變數的值是否相等。
2,引用資料型別中:用於比較兩個物件的位址值是否相等。
equals() 在 object 類中的預設實現作用是:用於比較兩個物件是否相同。
equals() 方法在超類也就是 object 中的實現如下:
publicboolean equals(object obj)
也就是判斷了兩個物件的位址值是否相同(是否是同乙個物件)。
除 object 之外的所有類都間接或直接的繼承了 object 類,如果這些類使用預設的 equals() 方法,那麼就等同於 == ,也就是比較兩個物件是否相同。但是一般情況下,這些類會根據自己的實際邏輯去重寫 equals() 方法。
如 string 類,string 類的 equals() 方法實現如下:
publicboolean equals(object anobject)
if (anobject instanceof
string)
return
true;}}
return
false;
}
首先判斷了兩個物件的位址值是否相等,如果是則直接返回了 true。
如果不是則繼續比較每個字元,當都是相同時返回了 true,否則返回了 false。
可以看到 string 類的 equals() 方法實際比較的是 string 的內容。
string s1 ="abc"
;string s2 =
newstring("abc"
);system
.out.println(s1 == s2);// false
system
.out.println(s1.equals(s2));// true
system
.out.println("***************===="
);string s3 =
"abc"
;string s4 =
"abc"
;system
.out.println(s3 == s4);// true
system
.out.println(s3.equals(s4));// true
system
.out.println("***************===="
);string s5 =
newstring("abc"
);string s6 =
newstring("abc"
);system
.out.println(s5 == s6);// false
system
.out.println(s5.intern() == s6.intern());// true
在理解上面的例子之前,我們首先要知道,string 類是乙個非可變類(immutable)。也就是說,string 類的例項是不可以被修改的。
如果我們想建立乙個 string 物件,主要有如下兩種方式:
string a =newstring("abc"
);string b =
"abc"
;
雖然兩種方式都是返回乙個 string 物件的引用,但是 jvm 對其的處理卻是不一樣的。
第一種方式:jvm 會在內部維護的「字串常量池」(string pool)中放入乙個 "abc" 物件,並在堆記憶體(heap)中建立乙個 string 物件,並將堆記憶體中物件的引用返回給 a。
第二種方式:jvm 會先在內部維護的「字串常量池」(string pool)中通過 string 的 equals() 方法查詢常量池中是否存放該 string 物件,如果有,則返回已有的 string 物件的引用。如果沒有,則會建立新的 string 物件到常量池中,並返回其引用。
了解之後,我們再來看看這三個小例子,其中 equals() 的結果就不說了,都是 true,因為比較的都是內容。
第乙個例子,其中 s1 的引用指向的是常量池中的位址引用,而 s2 則指向的是堆記憶體中的位址引用,於是比較結果是 false。
第二個例子,s3 和 s4 的引用都是指向常量池中的引用,於是比較結果為 true。
第三個例子,s5 和 s6 分別指向了兩個不同的堆記憶體中位址的引用,比較結果當然是 false。
但是當我們使用 intern() 方法後,結果卻是 true 了。這是為什麼呢?
string.intern() 方法是乙個 native 方法,它的作用是:
我們在上面已經知道了通過 new string() 建立字串,不僅會在堆記憶體中建立例項,常量池中也會。 那麼既然常量池中有,那麼 s5.intern() 和 s6.intern() 返回的都是常量池中的位址引用,於是結果當然是 true 了。
當我們比較基本型別的實際數值,或者是比較兩個物件的記憶體位址是否相等時,應該用 == 進行比較。
由於 string 類和 integer 類等都重寫了 equals() 方法,由 object 類中的比較位址值重寫為了比較實際內容,於是我們要想比較例項內容是否相同,應該用 equals() 方法。
當我們去定義一些類的時候,也可以根據實際邏輯去重寫 equals() 方法。比如定義乙個 person 類,那麼我們就可以重寫 equals() 方法,來根據 person 類中的 age 和 name 等校驗其是否相等。
mysql的 和 的區別 和 的區別
他們之間的區別用最直接的話來說就是 相當於對資料 加上 雙引號,相當於直接顯示資料。1 對傳入的引數視為字串,也就是它會預編譯select from user where name 比如我傳乙個csdn,那麼傳過來就是select from user where name csdn 2 將不會將傳入...
a和 a的區別
這道題目是我在面試的時候碰到的。當時面試官問我的時候,由於我什麼基礎都比較差,我聽到這個問題的時候整個人都傻了。我心想當時學c語言的時候,我只記得老師說這個都代表a陣列的首位址啊,這有什麼區別呢?這道題目,我最終沒有答出來,都怪我太菜了。今天這篇文章就當做是乙個記錄吧,也希望能給還不q清楚的同學一點...
and和or的區別
題目 求結果 a.1 or 2 b.1 and 2 c.1 2 2 d.1 2 2 結果 a 1 b 2 c 0 d 1 總結and和or的用法 and 從左到右,返回第乙個為假的表示式值,無假值則返回最後乙個表示式值。or 從左到右,返回第乙個為真的表示式值,無真值則返回最後乙個表示式值。備註 感...