在說這個以前我們首先要知道。棧和堆分別是什麼?當我們在聲明一個對象的時候,比如說聲明變量 String s = “a”。那這個時候,s它是變量,它是放在棧中的,然後這個a是字符串它是一個值,它是放在堆中的,也就是說變量放在棧中。對象或者說值是放在堆中。
然後他們倆的區別就是,== 等於比較的是對象。然後再說 equals ,實際上,equals是object類的方法,所以它適用於所有的對象。如果這個方法沒有被覆蓋的話,j就仍然是走 object 類中的方法,而 object 類裏面的equals方法其實。其實就是 == 。也就是說,在不覆蓋的情況下,equals 和 == 他們兩個是一致的。但是呢?在有些時候,比如說像string integer。他們對於 equals 進行了重寫。
然後我們再看一個問題
String a = "a"
String b = new String(“b”)
這兩個有什麼區別?
這裏面主要涉及到了一個常量池的問題。常量池就是在我們聲明一個常量的時候。那他是一個什麼動作呢?第一種string a = string。他其實在聲明的時候,會先去看常量池裏面有沒有 “a” 這個值,如果有的話,會直接指向他,比如說我們執行第三句,String c = “a”。這個時候其實不會重新創建一個 “a” ,而是直接會指向之前的那個 "a" ,也就是說 c 和 a 。他們的值其實是一樣的。然後我們在看 string b = new string(“b”),這種情況不管你在常量池中有沒有被聲明都會重新創建一個新的對象。