关于java:如果带有String比较的语句失败

If statement with String comparison fails

本问题已经有最佳答案,请猛点这里访问。

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

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

下面是整个班级。

这可能是一个非常愚蠢的逻辑问题,但我一直在这里把我的头发拔出来,无法解决这个问题。

感谢您的关注:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
if (s.equals("/quit"))

或者如果s字符串无效不介意/或者你真的不喜欢NPE:

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


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

在Java中有许多字符串比较。

1
2
3
4
5
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>


在Java中,EDCOX1的3个s是对象,所以当与EDCOX1(4)比较时,您正在比较引用,而不是值。正确的方法是使用equals()

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

1
2
3
String a ="aaa";
String b ="aaa";
boolean b = a == b;

b就是true。为什么?

因为jvm有一个由String常量组成的表。因此,每当使用字符串文本(引用")时,虚拟机返回相同的对象,因此==返回true

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

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

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.


如果您在C++和Java中编码,最好记住在C++中,字符串类具有= =运算符重载。但在Java中却不是这样。您需要使用equals()equalsIgnoreCase()来实现这一点。


你可以用

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

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

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


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