#java #operator-keyword #equality
#java #оператор-ключевое слово #равенство
Вопрос:
Почему оператор == ведет себя со ссылками иначе, чем с примитивными типами данных ?.
String string1 = "myString";
String string2 = "myString";
int num1 = 10;
int num2 = 10;
System.out.println("Value is " string1==string2); //WORKS FINE
System.out.println("Value is " num1==num2); //COMPILE TIME ERROR
Я не могу понять какую-либо логическую причину этого.
PS: Скобки внутри операторов печати намеренно не используются.
Спасибо 🙂
Комментарии:
1. Это имеет смысл, если вы думаете об
==
операторе, сравнивающем значения ссылок. Таким образом, во всех случаях==
оператор сравнивает значения своих операндов. Кроме того, то, что у вас есть, — это проблема порядка операций, а не проблема с==
оператором.
Ответ №1:
Это проблема приоритета операторов. Ваш второй оператор печати интерпретируется как:
System.out.println(("Value is " num1)==num2); // notice the parenthesis
который пытается сравнить строку с int, создавая ошибку времени компиляции. Добавьте круглые скобки, чтобы решить проблему:
System.out.println("Value is " (num1==num2)); // compiles
Приоритет операторов Java описан в Operators .
Теперь, это:
// original:
System.out.println("Value is " string1==string2);
// equivalent to:
System.out.println(("Value is " string1)==string2);
работает, потому "Value is " string1
что это сама строка, поэтому ее можно сравнить с string2
with ==
.
Комментарии:
1. Привет @arshajii. Я проверил это, попытавшись использовать
System.out.println("Value is " string1==string1)
. Мои предыдущие знания говорили, что это приведет к выводу true, но оно выводит false, как объясняется в вашем ответе. Спасибо 🙂2. @PiyushSaravagi Рад, что смог помочь. 🙂
Ответ №2:
Это из operator precedence
-за того, что вы не можете сравнить строку с int.
проблема 1:
System.out.println("Value is " num1==num2);
sign имеет более высокий приоритет, чем ==
so, поэтому он будет выполняться
первым, а затем ==
выполняется
Итак, после
выполнения это результат:
System.out.println("Value is 10"==num2); //num1 is appended to the string
проблема 2:
"Value is 10"==num2
вот где возникает ошибка компиляции, string нельзя сравнить с int .
решение:
если вы хотите сначала сравнить int, вам нужно заключить его в круглые скобки, чтобы избежать ошибки во время компиляции
System.out.println("Value is " (num1==num2));