странное поведение == в Java - PullRequest
       14

странное поведение == в Java

5 голосов
/ 09 февраля 2012

Я наблюдал странное поведение == оператора в Java. Я пытаюсь распечатать вывод следующим образом

String str1 = "Rajesh";
String str2 = "Rajesh";
System.out.println("Using equals() str1 and str2 Equals :"
            + str1.equals(str2));
System.out.println("Using == str1 and str2 Equals :" 
            + str1 == str2);

Печать первого оператора SOP

Использование equals () str1 и str2 Equals: true

и при следующей печати SOP только false.

Я попытался скомпилировать и Eclipse, и Net Beans, но результат тот же. Я так растерялся, почему

Использование == str1 и str2 равно:

не печатает

Помоги мне в этом

Заранее спасибо,

Raj

Ответы [ 10 ]

12 голосов
/ 09 февраля 2012

это то же самое, что и ("Using == str1 and str2 Equals :" + str1) == str2, и это, конечно, неверно. Выражение анализируется слева направо, поэтому сначала оно объединяет "Using == str1 and str2 Equals :" и str1, затем применяется оператор ==.

7 голосов
/ 09 февраля 2012

См. http://bmanolov.free.fr/javaoperators.php для таблицы приоритетов операторов в Java.

Оператор + имеет более высокий приоритет, чем оператор ==.

Таким образом, по сути, ваш кодэквивалентно следующему:

System.out.println( ("Using == str1 and str2 Equals :" + str1) == str2);

Обратите внимание на расположение скобок, которые я добавил.Он оценивается следующим образом:

System.out.println( (str_x + str1) == str2);

И затем к этому:

System.out.println( str_y == str2 );

А затем к этому:

System.out.println( false );

Чтобы получить желаемый результатВы должны использовать скобки, чтобы указать, что вы хотите разрешить оператор == ПЕРЕД операцией +:

System.out.println( "Using == str1 and str2 Equals :" + (str1 == str2));

Обратите внимание на новое размещение скобок.

4 голосов
/ 09 февраля 2012

Поскольку + имеет более высокий приоритет по сравнению с =, а если вы используете скобки (str1 == str2), то этот результат дает истину, потому что самый высокий приоритет (. Поэтому сначала он проверяет скобку внутри данных.

String str1 = "Rajesh";
        String str2 = "Rajesh";
        System.out.println("Using equals() str1 and str2 Equals :"
                + str1.equals(str2));
        System.out.println("Using == str1 and str2 Equals :" 
                + (str1 == str2));

Выход:

Using equals() str1 and str2 Equals :true
Using == str1 and str2 Equals :true
2 голосов
/ 09 февраля 2012

Попробуйте окружить его () следующим образом:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2));
2 голосов
/ 09 февраля 2012

Может, порядок операций вещь? Попробуйте:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2));
0 голосов
/ 09 февраля 2012

метод equals возвращает true в том и только в том случае, если x и y ссылаются на один и тот же объект.Follwoing является реализацией класса Object метода equals.

public boolean equals(Object obj) {
    return (this == obj);
    }

В классе String этот метод переопределен следующим образом.

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    } 

И если вы используете оператор ==, просто убедитесь, что обе ссылки имеют один и тот же объект.Аналогично методу класса Object равно.

0 голосов
/ 09 февраля 2012

В Java оператор == сопоставляет два объекта, т.е. их адрес, в то время как метод .equals() объединяет значения обоих объектов, поэтому вы получаете true для equals() и false для == какразные объекты.

0 голосов
/ 09 февраля 2012

str1.equals(str2) возвращает true, поскольку функция equals() сравнивает содержимое строковых переменных, где оператор == сравнивает экземпляры. Поскольку str1 и str2 являются двумя отличиями экземпляров класса String, возвращается false

0 голосов
/ 09 февраля 2012

Причина в том, что вы не можете сравнивать строки в Java, используя ==.

В C ++ или C # (или других языках, поддерживающих переопределение операторов), вы можете перезаписать оператор ==, чтобы обеспечить эту функциональность. Java не поддерживает это.

0 голосов
/ 09 февраля 2012

== можно использовать только для сравнения примитивных типов данных. Для сравнения объектов необходимо использовать метод equals. Использование оператора == на объектах фактически сравнивает там адреса вместо значений.

...