2011-09-15 34 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 - 该代码不是特别关键的性能。但是,在这种特殊情况下,代码将完全处理常量字符串,因此虽然它可能不是最佳选择,但对于演示尤其如此,这是一个有效的选择。

相关问题