Логический оператор для String

Есть код:

String a = "Hello", b = "Hello";
System.out.println("a==b: " + a==b);
System.out.println("a!=b: " + a!=b);

Который выводит следующее значение:

false
true

Я знаю, что операторы == и != сравнивают ссылки, отсюда и результат вывода (false,true), но куда из строки подевались стринговые значения "a==b: " и "a!=b: " не понимаю. Думаю тут что-то связанное с приведением типов, но до конца понять не могу. Может кто-нибудь пояснить конкретнее?


Ответы (2 шт):

Автор решения: Byb

У оператора сложения + приоритет выше, чем у оператора сравнения ==. Поэтому выражение

System.out.println("a==b: " + a==b);

расценивается как

System.out.println(("a==b: " + a)==b);

То есть, мы складываем две строки и результат сравниваем с b, получая в ответе просто false.

Аналогично для того случая, где мы используем оператор !=: его приоритет также ниже, чем у оператора +.

Для того, чтобы на экран было выведено то, что вы хотите, результат сравнения строк нужно брать в скобки:

System.out.println("a==b: " + (a==b));

Тогда мы получим:

a==b: true

Для случая с !=, соответственно, аналогично.

Это потому, что такая запись уже будет расценена как сложение двух строк. Первая строка - a==b, вторая - булево выражение false/true, приводимое по ходу дела к строке.


Если бы мы ушли от такого сочетания операторов +, == и !=, то для ожидаемого вывода нем не понадобилось бы расставлять скобки. Например, если мы сравним строки посредством метода equals()

System.out.println("a==b: " + a.equals(b));

то в результате получим

a==b: true

Очевидно, в этом случае содержимое println() уже легко и однозначно распознаётся как сложение двух строк.


Как правильно заметил @Эникейщик, для идентичных строк Hello и Hello результаты, выдаваемые операторами == и !=, будут соответственно true и false. У вас получилось наоборот по тем причинам, которые я описал выше, а не из-за "сравнения ссылок".

А почему для одинаковых строк оператор == в данном случае выдаст true - можно прочитать в соседнем ответе.

→ Ссылка
Автор решения: Котлетка еее

Да, приоритеты операций тут и определили результат выражения. Но я хочу дополнить.

Вообще-то, в Java есть такая штука, как пул стрингов. Для строк, значение которых известно до запуска программы, все переменные String с одинаковыми значениями получают ссылку на один и тот же объект с этим значением. У вас как раз при компиляции уже известно, что и a, и b, будут равны "Hello". Поэтому и сравнение методом equals(), и сравнение через ==, оба должны давать true.

a.equals(b)  //true  
a == b       //true  
a != b       //false  
→ Ссылка