2011-03-12 77 views
1

我正在使用JSP中的Java代码,我试图比较字符串,并且遇到问题。Java中的字符串比较

我宣布两个字符串

s1 = "din"; 
s2 = "din"; 

然而,if (s1 == s2)永远不会执行。有人能帮我吗?

+3

请显示您的实际代码。你在使用scriptlets吗? (请不要) – 2011-03-12 23:31:31

+3

在一些JVM上,这实际上会工作,因为他们实习所有字符串常量。 – Neil 2011-03-12 23:44:36

+1

您应该使用.equals比较平等(如其他人所述)。但是,请注意,在给出的例子中(s1 == s2)通常会等于true,因为字符串文字将被实现(s1和s2将引用同一个对象) – Neil 2011-03-12 23:44:52

回答

4

你用 '等于',当你比较字符串。

if(s1.equals(s2)) { true }

+3

s1将**总是**等于s1 – 2011-03-12 23:33:54

+0

是的,抱歉关于错字。 – heldt 2011-03-12 23:38:53

+0

这是我得到java.lang.NullPointerException的异常,当我使用等于 – pa12 2011-03-12 23:45:25

11

运算符==用于比较字符串是否相等,而不是值相等。

尝试调用equals而不是使用==

if (s1.equals(s2)) { ... } 
2

你到底想达到什么目的?

比较字符串或它们的值? 如果你期待,你(如果)条件应该返回true,则使用

s1.equals(s2); 
5

比较字符串时,你应该始终使用equals方法,而不是==:

if(str1.equals(str2)) 

...会正确的做事方式。

在哪里产生了困惑就像是以下情况:

String str1 = "hello"; 
String str2 = "hello"; 
System.out.println(str1==str2); 

以上将实际打印出真实的。但是,除了上述的学术目的外,您不应该使用它。如果你正在使用==,你正在检查这些值是否是堆中物理上相同的对象。如果你使用.equals(),你会检查它们是否有意义的相等,即使它们实际上是两个单独的对象。 有时候,特别是像上面那样涉及文字时(或者当您手动调用intern()方法时),出于性能原因,Java会自动使两个单独的字符串对象指向同一个对象。然而,没有合理的保证会发生(除非你想打扰自己的JLS的明确细节,即使如此,它只是有保证),大多数情况下不会。以下例如:

String str1 = "hello"; 
String str2 = "he"; 
str2 += "llo"; 
System.out.println(str1 == str2); 

现在它打印错误,因为尽管有意义相等,我们还没有达到Java以前提供的相同的优化。

在上述两种情况下,使用equals()将返回true。

+0

在Java语言规范中,当字符串是相同的对象时有一些保证,但是你是对的,总是更好地使用'equals'。 – 2011-03-13 01:33:24

+0

@PaŭloEbermann好点 - 我的意思是从逻辑的角度来看更多,而不是了解JLS的细节。 – berry120 2011-03-13 01:34:55