【问题标题】:If statement with String comparison fails [duplicate]如果带有字符串比较的语句失败[重复]
【发布时间】:2010-10-14 02:57:48
【问题描述】:

我真的不知道为什么下面的 if 语句没有执行:

if (s == "/quit")
{
    System.out.println("quitted");
}

下面是全班。

这可能是一个非常愚蠢的逻辑问题,但我一直把头发拉到这里无法弄清楚。

感谢收看 :)

class TextParser extends Thread {
    public void run() {
        while (true) {
            for(int i = 0; i < connectionList.size(); i++) {
                try {               
                    System.out.println("reading " + i);
                    Connection c = connectionList.elementAt(i); 
                    Thread.sleep(200);

                    System.out.println("reading " + i);

                    String s = "";

                    if (c.in.ready() == true) {
                        s = c.in.readLine();
                        //System.out.println(i + "> "+ s);

                        if (s == "/quit") {
                            System.out.println("quitted");
                        }

                        if(! s.equals("")) {
                            for(int j = 0; j < connectionList.size(); j++) {
                                Connection c2 = connectionList.elementAt(j);
                                c2.out.println(s);
                            }
                        }
                    }
                } catch(Exception e){
                    System.out.println("reading error");
                }
            }
        }
    }
}

【问题讨论】:

  • 很遗憾,我们不能为编辑提供 +1。
  • == 表示;这是同一个对象吗?它不匹配包含相同数据的对象。
  • 它怎么会被标记为“多线程”?

标签: java multithreading if-statement string-comparison


【解决方案1】:

如果您使用 C++ 和 Java 编写代码,最好记住在 C++ 中,字符串类重载了 == 运算符。但在 Java 中并非如此。您需要为此使用equals()equalsIgnoreCase()

【讨论】:

    【解决方案2】:

    java 中的Strings 是对象,因此与== 比较时,您是在比较引用,而不是值。正确的方法是使用equals()

    但是,有办法。如果要使用== 运算符比较String 对象,可以利用JVM 处理字符串的方式。例如:

    String a = "aaa";
    String b = "aaa";
    boolean b = a == b;
    

    b 将是 true。为什么?

    因为 JVM 有一个 String 常量表。所以每当你使用字符串字面量(引号"),虚拟机返回相同的对象,因此==返回true

    通过使用intern() 方法,即使是非文字字符串,您也可以使用相同的“表格”。它返回对应于该表中当前字符串值的对象(或将其放在那里,如果不是)。所以:

    String a = new String("aa");
    String b = new String("aa");
    boolean check1 = a == b; // false
    boolean check1 = a.intern() == b.intern(); // true
    

    因此对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 为真。

    【讨论】:

      【解决方案3】:

      在您的示例中,您正在比较字符串对象,而不是它们的内容。

      你的比较应该是:

      if (s.equals("/quit"))
      

      或者如果s string nullity 不介意/或者你真的不喜欢 NPE:

      if ("/quit".equals(s))
      

      【讨论】:

      • 我更喜欢 s.equals("/quit")。它是美观的,但我希望重要的当前数据能够轻松可见。
      • s.equales("/quit") 将抛出 NullPointerException is s is null, "/quit".equals(s) 将永远不会抛出 NPE
      • 所以 "/quit".equals(s) 将掩盖 s 无意中为空的错误。
      • @starblue 好点,总是需要考虑其他事情
      • @ReneS 无论 string/context s 是什么,我仍然会做 "".equals(s) 因为我知道 不会是 NULL 而 s 可能。但是如果 s.equals(s2) 那么你是对的,但是你必须再次用 if(s!= null){ 块包围它。
      【解决方案4】:

      要比较字符串是否相等,不要使用 ==== 运算符检查两个对象是否完全相同:

      Java中有很多字符串比较。

      String s = "something", t = "maybe something else";
      if (s == t)      // Legal, but usually WRONG.
      if (s.equals(t)) // RIGHT
      if (s > t)    // ILLEGAL
      if (s.compareTo(t) > 0) // also CORRECT>
      

      【讨论】:

      • 检查引用是否相同。
      【解决方案5】:

      你可以使用

      if("/quit".equals(s))
         ...
      

      if("/quit".compareTo(s) == 0) 
          ...
      

      后者进行@​​987654321@比较,如果两个字符串相同则返回0。

      【讨论】:

        【解决方案6】:

        您不应该使用 == 进行字符串比较。该运算符只会检查它是否是同一个实例,而不是同一个值。使用 .equals 方法检查相同的值。

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 2013-04-28
          • 1970-01-01
          • 2012-12-06
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多