標籤:原來 語言 需要 obj 一個 system 代碼 比較 編譯器
關於字串比較用equals還是用==,總結一下.
字串為對象:1."=="所有"物件變數"用==作比較時比的是兩個對象在堆中的引用.2."equals()"所有對象的equals方法繼承自Object類的方法,而String重寫了equals方法的比較演算法,它比較的是字串的內容,即在堆中的了符序列3.特點字串是一種比較特殊的對象,這裡的特殊指的是在運行期間,它的賦值直接改變引用(當然,任何對象的賦值都是直接改變的引用,只不過字串這種東西往往讓人容易理解為它是在原來的基礎上操作的,尤其是+=這類操作),而不是在原來所引用的記憶體塊中做修改.(因此有了StringBuffer類的出現)結論:1.String s1 = "hello";String s2 = "hello";System.out.println(s1.equals(s2)); //trueSystem.out.println(s1 == s2); //true按照上面的說法,第一個true不難理解.而第2個之所以也為true是因為,java編譯器用的類似於C語言中的"文字池機制",即在原始碼中所有的字串常量聲明全部放在一塊記憶體地區,因此當一個字串聲明時賦值的是一個字串常量,那麼如果"文字池"中有這個字串常量,編譯器將直接把它的引用賦值給這個變數.因此在用==來比較s1和s2時,將會得到true.2.String s1 = "hello";String s2 = "hello";s1 = s1 + "a";s2 = s2 + "a";System.out.println(s1.equals(s2)); //trueSystem.out.println(s1 == s2); //false第3,4行的賦值操作在運行期間執行,根據上面的知識點3:兩個變數的引用將會發生改變.因此這時用==相比時將會得到false;(在運行期間所得到的字串內容,將不會放到所謂的"文字池"之中,然後如果有相同內容的變數引用相同內容,這樣作的話需要每次字串改變時需要檢查它的內容,並再在文字池中尋找看是否有相同內容的常量,太過浪費效率.)("文字池機制"也許也是為什麼字串對象在作更改時,直接改變引用的一個原因,因為如果直接對引用的記憶體塊作操作的話,另一個指向相同引用的字串變數將也會發什麼改變,發生邏輯混淆)3.代碼略.當字串對象從不同地方(字串常量;本地資源檔讀取;網路傳輸:如表單提交;等等)獲得時:除了是編譯期間用相同常量賦值的字串變數的引用相同外,其它的全部是新的引用.因此,與這種變數直接用==相比時將得到false,即使內容相同應用結論:1.如果是單純的比較字串內容的話:用equals()2.如果確實是要比較兩個變數的引用的話:用==
JAVA 字串比較: equals() 與 ==