Подтвердить что ты не робот

Если инструкция с сопоставлением строк не выполняется

Я действительно не знаю, почему инструкция 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");
                }
            }
        }
    }
}
4b9b3361

Ответ 1

В вашем примере вы сравниваете строковые объекты, а не их содержимое.

Ваше сравнение должно быть:

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

Или если s string nullity не против/или вам действительно не нравятся NPE:

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

Ответ 2

Чтобы сравнить строки для равенства, не использовать ==. Оператор == проверяет, являются ли два объекта точно одним и тем же объектом:

В 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>

Ответ 3

String в java - это объекты, поэтому при сравнении с == вы сравниваете ссылки, а не значения. Правильный способ - использовать 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.intern() == t.intern() истинно тогда и только тогда, когда s.equals(t) истинно.

Ответ 4

Вы можете использовать

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

или

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

Последний делает lexicographic сравнение и возвращает 0, если две строки одинаковы.

Ответ 5

Если вы используете код на С++ и Java, лучше помнить, что в С++ класс string имеет перегруженный оператор ==. Но не так на Java. для этого вам нужно использовать equals() или equalsIgnoreCase().

Ответ 6

Вы не должны сравнивать строки с ==. Этот оператор проверяет только, является ли он одним и тем же экземпляром, а не тем же значением. Используйте метод .equals для проверки того же значения.