【问题标题】:String comparison in Java [duplicate]Java中的字符串比较[重复]
【发布时间】:2011-07-14 06:23:09
【问题描述】:

我正在使用 JSP 中的 Java 代码,我正在尝试比较字符串,但我遇到了问题。

我已经声明了两个字符串

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

但是,if (s1 == s2) 永远不会执行。有人可以帮我吗?

【问题讨论】:

  • 请出示您的实际代码。你在使用小脚本吗? (请不要)
  • 在某些 JVM 上这实际上会起作用,因为它们会保留所有字符串常量。
  • 您应该使用 .equals 来比较相等性(正如其他人所提到的)。但是,请注意,在您给出的示例中 (s1 == s2) 通常等于 true,因为字符串文字将被保留(s1 和 s2 将引用同一个对象)
  • 什么意思:“从不执行”?
  • @Neil:不是在“某些 JVM”上,而是在所有方面,因为语言规范规定了这一点。 (我认为在 dins 代码中实际上没有字符串文字。)

标签: java string


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    比较字符串时使用“等于”。

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

    【讨论】:

    • s1 将总是等于 s1
    • 这是我在使用 equals 时得到 java.lang.NullPointerException 的异常
    • @Elite ... 除非s1null ... :-)
    • @Stephen C,然后s1.equals() 将抛出一个 NPE。 :)
    【解决方案3】:

    你想达到什么目的?

    比较字符串或它们的值? 如果您期望您的 (if) 条件应返回 true,请使用

    s1.equals(s2);
    

    【讨论】:

      【解决方案4】:

      在比较字符串时,您应该始终使用 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);
      

      现在它打印为 false,因为尽管有意义地相等,但我们没有达到 Java 之前提供的相同优化。

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

      【讨论】:

      • Java 语言规范中有一些关于字符串何时是同一个对象的保证,但你是对的,最好总是使用equals
      • @Paŭlo Ebermann 好点 - 我的意思是从逻辑的角度来看,而不是了解 JLS 的详细信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多