關於“==”
在Java語言中,當用“==”匹配時,就是比較兩個記憶體單元的內容是否一樣。
如果是基本型別byte、boolean、short、char、int、float、double,就是直接比較的他們的值。
如果是引用型別,比較的就是引用的值,“引用的值”可以被認為是物件邏輯地址。如果引用型別用“==”就是比較的兩個物件的地址是否相同。
那麼為什麼例子中a與b指向了同一個記憶體單元?
這就是JVM的“編譯時最佳化”,當編譯器在編譯程式碼:String a = “a” + “b” + “2”; 時,會將其編譯為,String a = “ab2”; 。因此 a == b 為true。
關於equals()
說到 “==” 不得不說一下equals()。
equals()是在Object類中被定義的,它的定義中就是使用 == 來匹配,也就是說如果不重寫equals() 比較的也是引用地址。
equals()的存在就是為了希望子類去重寫,用於比較值,不去比較引用地址。
String 類中的就是重寫了equals(), 如下:
所以我們在比較String時都是用了equals()方法。
總結
“==” 基本型別比較值,引用型別比較引用地址。
String “+” 操作 JVM編譯時會做最佳化。
equals()方法,不重寫比較的也是引用地址。