【问题标题】:Comparing two strings in Java [duplicate]比较Java中的两个字符串[重复]
【发布时间】:2012-06-19 20:05:25
【问题描述】:

可能重复:
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 实例进行身份检查。
  • 仅对原始数据类型使用 ==,对对象和字符串使用 equals() 方法
  • 这类问题是没有研究的结果...
  • EditText是一个什么样的组件?

标签: java android string


【解决方案1】:

在 Java 中,必须使用 equals() 比较两个字符串(通常是两个对象),而不是 ==== 运算符测试 identity(意思是:测试两个对象在内存中是否完全相同),而方法 equals() 测试两个对象的 equality(意思: 测试两个对象是否具有相同的 value),无论它们是否是两个不同的对象。您几乎总是对平等感兴趣,而不是身份。

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

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

另外请注意,在对equals() 的调用中将字符串文字放在首位是一个好习惯,这样在第二个字符串是null 的情况下您是安全的,避免了可能出现的NullPointerException

【讨论】:

  • "另外请注意,在对equals() 的调用中将字符串文字放在第一位是一个好习惯,这样在第二个字符串为空的情况下您是安全的,避免了可能的NullPointerException。” 在健壮的代码中,这实际上是一个反对将文字放在首位的参数。如果您的逻辑在大多数情况下无法在比较之前处理这种情况,那么您想要 NPE,因此您可以在发布之前修复逻辑。
  • @T.J.Crowder,欢迎讨论。如果您按照我上面的建议比较字符串,一些静态分析检查器会生成警告。有人可能会争辩说,以这种方式比较字符串比在所有地方显式测试以查看字符串是否为空更能处理极端情况
  • @T.J.Crowder 例如,查看EqualsAvoidNull 签入Checkstyle
  • @Óscar:正如你所说,这是人们可以不同意的事情。我从不首先检查文字,因为它读起来很糟糕(对于以英语为母语的人,实际上对于大多数其他西方语言的母语人士来说),而且因为如果我做了一些愚蠢的事情,我再次想要 NPE .迄今为止?恰好 个与之相关的生产错误。在测试中发现了一些不错的错误,然后我能够修复它们。但同样,这是合理的人们可以并且确实不同意的事情。 :-)
【解决方案2】:

在 Java 中 Strings 必须与他们的 equals() 方法进行比较:

String foo = "foo";
String bar = "bar";
if (foo.equals(bar)) System.out.println("correct");
else System.out.println("incorrect");

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在java中比较2个对象的正确方法是使用equals() method of Object class 由于String在java中是一个对象,所以应该以同样的方式进行比较。

      比较字符串的正确方法是用,

      s1.equals(s2)
      

      所以你可以使用它,

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

      【讨论】:

        【解决方案5】:
        ((TextView)findViewById(R.id.textView1)).setText("SampleTest".equals(((EditText)findViewById(R.id.editText1)).getText().toString()) ? "correct!" : "incorrect!");
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-14
          • 1970-01-01
          • 2013-06-24
          • 2012-11-23
          相关资源
          最近更新 更多