我不明白这个(“string”==“string”)的例子

时间:2011-09-15 22:38:52

标签: java string equals

我在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,那那就是一个大问题。

5 个答案:

答案 0 :(得分:7)

是的,equals()肯定会更好更正确。在Java中,字符串常量池被维护并智能地重用以提高性能。所以可以工作,但只有当evt.getPropertyName()确保返回常量时才能保证。

此外,如果"progress".equals(evt.getPropertyName())为空,则更正确的版本为evt.getPropertyName()。请注意,String.equals的实现始于在进行char-by-char比较之前使用==作为第一个测试,因此与原始代码相比,性能不会受到太大影响。

答案 1 :(得分:2)

此代码的正确版本应为:

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

这可能会起作用,因为JVM处理字符串常量的方式。每个字符串常量为intern()ed。因此,如果evt.getPropertyName()返回对字符串常量的引用而不是使用==将起作用。但这种形式很糟糕,总的来说它不起作用。

答案 2 :(得分:2)

我们在看哪个演示?

这解释了equals()vs ==

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

  

重要的是要了解equals()方法和==运算符执行两个不同的操作。如上所述,equals()方法比较String对象中的字符。 ==运算符比较两个对象引用以查看它们是否引用同一实例。以下程序显示了两个不同的String对象如何包含相同的字符,但对这些对象的引用不会相等:

因此,在您的特定示例中,它正在比较引用以查看它们是否是相同的引用,而不是查看字符串字符是否与我相信匹配。

答案 3 :(得分:1)

这仅在evt.getPropertyName()返回值为“progress”的常量字符串时才有效。 对于常量字符串,我的意思是在编译时进行评估。

答案 4 :(得分:0)

在大多数情况下,在比较String时,最好使用equals。但是,如果您知道您将比较完全相同的String个对象(不只是两个具有相同内容的字符串),或者您正在完全处理常量String s 你真的关心性能,使用==比使用equals要快一些。您通常应该使用equals,因为您通常不关心性能,无法考虑使用==的所有其他先决条件。

在这种情况下,the progress demo的作者可能应该使用equals - 该代码对性能不是特别重要。但是,在这种特殊情况下,代码将完全处理常量字符串,因此虽然它可能不是最佳选择,特别是对于演示,它是一个有效的选择。