2013-05-03 15 views
-1

System.out.print("a".replace('a','1')=="a".replace('a','1'));字符串替換(),返回值的比較使用「==」

true被期待作爲代替()返回字符串和字符串比較是可能的==。 但上面的代碼打印false。解釋嗎?

+1

您不應該將java中的字符串與'=='進行比較。它檢查它們的引用是否相同,而不是它們的值。 – 2013-05-03 20:39:44

+0

我通過Nizet爵士的上述帖子瞭解** String Interning **的概念。這就是S.O.Pln(「a」==「a」);「返回true」的原因。謝謝大家的時間和合作。 :) – 2013-05-03 20:50:05

回答

4

==檢查它們是否在內存中是同一個對象,所以在相同的位置。

由於這兩個不同的字符串恰好具有相同的內容,因此您需要將其與.equals進行比較,該比較值不是引用。

+0

或者,如果你想比較你替換它們的數字值,你需要parseInt這個新的替代品,然後你可以使用'==' – aug 2013-05-03 20:41:06

+0

Jean:SOPln(「ab」==「ab」) ;返回'true'。他們是否共享相同的內存? – 2013-05-03 20:44:50

+1

@ChaZ在這種情況下,是的,因爲它們在編譯時是已知的,所以它們在內存中被賦予一個靜態位置,而不是在運行時創建。這是一個棘手的案例。爲了安全起見,除非您明確知道您關心內存位置,否則請始終將字符串與.equals進行比較。 – 2013-05-03 20:45:52

1

不,字符串比較不建議使用==。在某些情況下,例如:

new String("test") == new String("test") 

它返回false。

所有這些都是因爲理論上Java應該搜索字符串池中的某個字符串,但實際上有一些操作會返回新的對象而不是駐留在字符串池中的操作。

這對於總是使用「equals」方法而不是==來說非常重要!

+1

我甚至會說在*大多數情況下,平等測試將返回false。 – stevevls 2013-05-03 20:40:20

+4

我會去說,從來沒有使用'=='來比較字符串。 – 2013-05-03 20:41:19

+0

同意。是一個學術問題,這就是我問的原因。 順便說一句,爲什麼'S.O.Pln(「ab」==「ab」);'返回'true'?他們沒有分享我想的相同的記憶。 – 2013-05-03 20:45:32

相關問題