2011-09-15 31 views
2

我發現這個Java代碼的Java教程頁面上:我不明白這一點( 「串」 == 「字符串」)例如

if ("progress" == evt.getPropertyName()) 

http://download.oracle.com/javase/tutorial/uiswing/examples/components/index.html

怎麼會這樣的工作?我認爲我們必須在這種情況下使用equals()方法(string.equals("bla"))?我們在這裏也可以使用equals()嗎?它會更好嗎?有任何想法嗎?

編輯:所以如果equals()會更好,那麼我真的不明白爲什麼一個嚴重的Oracle教程頁面沒有使用它?此外,我不明白爲什麼它的工作,因爲我認爲一個字符串是一個對象。如果我說object == object,那麼這是個大問題。

+0

對你的Edit的回答,文字「progress」可能被定義爲static和final,而JVM維護一個String文字的內部池,並且在編譯代碼中用相同的引用替換類似的字符串文字。正如其他海報所指出的那樣,使用==來比較字符串文字並不被認爲是一種好的做法。 –

+0

在Oracle教程中您會發現這樣的事情,這似乎很奇怪。它只是表明除了我之外,你不能相信任何人。:) – emory

+0

+1有時候Java就像英語。 –

回答

7

是的,equals()肯定會更好更正確。在Java中,一個字符串常量池被維護和重用智能地提高性能。所以這可以工作,但只有當evt.getPropertyName()有保證返回常量時纔有保證。

此外,更正確的版本將是"progress".equals(evt.getPropertyName()),以防evt.getPropertyName()爲空。請注意,String.equals的實現從開始使用==作爲逐字符比較之前的第一個測試開始,因此與原始代碼相比,性能不會受到太大影響。

2

這段代碼的正確版本應該是:

if ("progress".equals(evt.getPropertyName())) 

這可能是因爲該JVM處理字符串常量的方式工作。每個字符串常量是intern()ed。因此,如果evt.getPropertyName()返回一個字符串常量的引用,則會使用==。但它是不好的形式,一般來說它不會工作。

+0

Spike,如果evt.getPropertyName返回一個字符串常量的引用,它肯定會*工作。 –

+1

@Jon Bright:答案在本質上是正確的 - 當然它有正確的代碼。誰低估了這一點太苛刻了。 –

+0

@Platinum Azure:我因爲技術上的錯誤而低估了它。如果Spike刪除了「(可能)」,我會很樂意刪除這個投票。由於問題的整個目的是用==和等於*來闡明情況,在這種情況下,引入技術不準確性是引起失望的一個很好的理由。 (如果問題不在這個問題上,我不會太挑剔。) –

2

我們在看什麼樣的演示?

這就解釋了equals()方法VS ==

http://www.java-samples.com/showtutorial.php?tutorialid=221

明白,equals()方法和==操作符執行兩種不同的操作是很重要的。正如剛剛解釋的那樣,equals()方法比較String對象內的字符。 ==運算符比較兩個對象引用以查看它們是否引用同一個實例。以下程序顯示瞭如何將兩個不同的String對象,包含相同字符,但對這些對象的引用將並不等同:

所以在您的特定示例中,比較基準,看看他們是相同的引用,而不是查看字符串是否匹配我相信。

1

只有當evt.getPropertyName()返回值爲「progress」的常量字符串時,這纔有效。 對於常量字符串,我的意思是在編譯時進行評估。

0

在大多數情況下,比較String時,使用equals是最好的。然而,如果你知道你會比較完全相同的String對象(不只是兩個字符串具有相同的內容),或者如果你完全處理String,你真的關心性能,使用==將比使用equals快一些​​。您通常應該使用equals,因爲您通常不關心性能,以充分考慮使用==的所有其他先決條件。

在這種情況下,the progress demo的作者可能應該使用equals - 該代碼不是特別關鍵的性能。但是,在這種特殊情況下,代碼將完全處理常量字符串,因此雖然它可能不是最佳選擇,但對於演示尤其如此,這是一個有效的選擇。

相關問題