2013-10-22 87 views
0

Java中的String s1="Hello"String s1=new String("Hello")之間的區別是什麼?String s1 =「Hello」和String s1 = new String(「Hello」)之間的區別是什麼?

如果String s1="Hello"String s2=new String("Hello"),將s1 == s2

+0

那麼'=='運算符匹配引用。由於在這個例子中有2個元素s1和s2,因爲他們有不同的引用/地址,所以輸出是s1 == s2將是錯誤的。但是如果使用'equals()',則輸出將爲真,因爲這些值將進行比較,並且根據問題的值是相同的。 – BIJAY

+0

如果有兩個字符串,即s1和s2,如果String s1 =「Hello」; String s2 =「Hello」;這裏s1 == s2給出了一個真正的輸出。 – BIJAY

回答

0

如果String s1 =「Hello」並且String s2 = new String(「Hello」),那麼s1 == s2?

答案是:

因爲,S1和S2是不同的對象,並string是不可變的。所以,s1 == s2將是falses1.equals(s2)將是true

1

這裏是距離Joshua Bloch的Effective Java的關於 「)新的String(」 使用的報價:

由於什麼不能做一個極端的例子,此聲明:

的String = new String(「stringette」); // 不要這樣做!

該語句每次執行時都會創建一個新的String實例,並且這些對象創建都不是必需的。字符串構造函數(「stringette」)的參數本身就是一個字符串實例,在功能上與構造函數創建的所有對象完全相同 。如果這個 用法出現在循環或頻繁調用的方法中,則可以毫無用處地創建數百萬個字符串實例。改進的版本是 簡單地執行以下操作:

的String = 「stringette」;

2
String myStr = "hello"; 
String myStr1 = "hello"; 

這些時通過雙等於兩者相比將評估爲true。然而,它們並不相等,而是都指向內存中相同的「文字串」。這從來沒有如何比較一個字符串的內容,所以不要讓這個騙過你。

String myStr = new String("hello"); 
String myStr1 = new String("hello"); 

將評估爲false,因爲它們都引用具有不同內存地址的不同對象。

始終始終始終use myStr.equals(myStr1)比較字符串的內容是否相等時。 還記得==只比較它們是否引用內存中的同一個對象。

+0

+1相關示例.. –

+0

如果String s3 =「Hello」,則s3 == s1? –

+0

好吧,它會出現,如果他們在那種情況下,但它不是比較他們的方式,我們想比較他們,這是內容。我們希望看看s1和s3中的每個字符是否都是同一個,而不是兩個引用變量是否指向內存中的相同位置。不要習慣於以這種方式比較對象(字符串是一個對象),因爲你會得到錯誤的結果,後來它會混淆你。對象是不透明的(封裝和數據隱藏),因此定義對象內容的內容會有所不同。現在只需使用.equals() – Whoppa

3

編碼此:

String s1 = "Hello"; 

導致JVM到intern字符串文字:同一字符串文字的每一個的使用將是相同的對象的引用。

編碼這樣的:

String s2 = new String("Hello") 

總是會創建一個新的String對象。

那麼,會s1 == s2?不,從不。

+0

如果字符串s3 =「Hello」,將s3 == s1? –

+0

@ CMQ_14是的。究竟。 – Bohemian

0

你的問題的回答是否定的,請在下面找到了原因: -

  1. 字符串S1 = 「你好」。在這裏,hello字符串將被存儲在一個位置,並且s1將保持對它的引用。
  2. String s2 = new String(「Hello」)將創建一個新對象,將引用該對象並將存儲在不同的位置。

條件s1 == s2將比較內存中現在2個不同位置的內存位置。所以它會變成錯誤的。

相關問題