我在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 :(得分: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
- 该代码对性能不是特别重要。但是,在这种特殊情况下,代码将完全处理常量字符串,因此虽然它可能不是最佳选择,特别是对于演示,它是一个有效的选择。