回覆列表
-
1 # JAVA破局之路
-
2 # 愛大海的聲音
Java 中 string 不屬於基本的資料型別,只是代表一個類,是一個引用型別。String是引用型別,不過java有字串常量池機制,宣告字串常量或者字串常量連線都要用到字串常量池。如果常量池中有該字串序列則返回,所以str建立了一個字串並放入常量池中,str2內的字元序列已在常量池中所以str2直接指向str指向的物件。基本資料型別就只有八個,數值型:byte,short,int,long,浮點型:float,double,字元型:char,布林型:boolean。
關於“==”
在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()方法,不重寫比較的也是引用地址。