Логический оператор для 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 шт):
У оператора сложения + приоритет выше, чем у оператора сравнения ==. Поэтому выражение
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