在Java中比较两个字符串

7
我知道这是一个愚蠢的问题,但为什么这段代码不起作用?
可能重复:
Java String.equals versus ==
boolean correct = "SampleText"  == ((EditText)findViewById(R.id.editText1)).getText().toString();
    if(correct) ((TextView)findViewById(R.id.textView1)).setText("correct!");
    else ((TextView)findViewById(R.id.textView1)).setText("uncorrect!");  

重点是检查“editText1”的内容是否等于“示例文本”


你实际上正在使用两个String实例进行身份验证。 - Genzer
仅对原始数据类型使用“==”,对于对象和字符串,请使用equals()方法。 - David Kroukamp
请查看如何在Java中比较字符串? - Luca Geretti
4
这种问题是没有进行研究的结果... - Luiggi Mendoza
EditText是什么类型的组件? - RicardoE
显示剩余2条评论
5个回答

26

在Java中,两个字符串(以及一般而言,两个对象)必须使用equals()进行比较,而不是====操作符用于测试身份(意思是:测试两个对象在内存中是否完全相同),而方法equals()测试两个对象的相等性(意思是:测试两个对象是否具有相同的),不管它们是不同的对象。几乎总是对相等性感兴趣,而不是对身份感兴趣。

要修复您的代码,请执行以下操作:

String str = ((EditText)findViewById(R.id.editText1)).getText().toString();
boolean correct = "SampleText".equals(str);

还要注意,在调用equals()方法时,把字符串字面量放在前面是一个好习惯。这样,如果第二个字符串是null,你就不会遇到可能出现的NullPointerException


3
请注意,最好的做法是在调用equals()时将字符串字面量放在第一位,这样如果第二个字符串为 null,就可以避免可能出现的空指针异常。在健壮的代码中,实际上这是反对先放字面量的论点。大多数情况下,如果逻辑在比较之前无法处理该情况,你需要产生 NPE,以便在发布前修复逻辑。 - T.J. Crowder
@T.J.Crowder 这个问题还有讨论的余地。一些静态分析检查器会在您不像我上面建议的那样比较字符串时生成警告。可以说,以这种方式比较字符串可以更好地处理角落情况,而不是在所有位置显式测试字符串是否为空。 - Óscar López
举个例子,看一下Checkstyle中的EqualsAvoidNull检查。@T.J.Crowder - Óscar López
1
@ Óscar:就像你所说的,这是人们可以持不同意见的事情。我从来不会首先检查文字本身,因为它读起来很糟糕(对于英语母语者和大多数其他西方语言的母语者而言),并且因为如果我做了什么愚蠢的事情,我想要NPE。到目前为止?与此相关的生产错误数量为。在测试中捕获了一些好的错误,然后我能够修复它们。但是,这是一些合理的人可以并且确实持不同意见的事情。 :-) - T.J. Crowder

1
在Java中,Strings必须使用它们的equals()方法进行比较:
String foo = "foo";
String bar = "bar";
if (foo.equals(bar)) System.out.println("correct");
else System.out.println("incorrect");

1

要比较两个字符串的值(是否相等),您需要使用equals而不是==(或者如果您不关心大小写,则使用equalsIgnoreCase)。
使用equals将检查字符串的内容/值(与“==”相反,它只会检查两个变量是否指向同一个对象-而不是相同的值)。


1
在Java中比较两个对象的正确方式是使用Object类的equals()方法,而作为Java中的一个对象,字符串应该以同样的方式进行比较。
比较字符串的正确方式是:
s1.equals(s2)

所以你可以使用这个:

boolean correct = "SampleText".equals(((EditText)findViewById(R.id.editText1)).getText().toString());

该内容与IT相关。

0
((TextView)findViewById(R.id.textView1)).setText("SampleTest".equals(((EditText)findViewById(R.id.editText1)).getText().toString()) ? "correct!" : "incorrect!");

这有点长,可能有更好的方法可以做到这一点。.toString()感觉很奇怪!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接