Java: equals() и === для переменных String и int
Я пытаюсь понять метод равенства (==) equals(), но не могу объяснить это поведение. Может кто-нибудь объяснить это поведение с помощью следующих операторов println.
String a="Hai";
String b="Hai";
int c=5, d=5;
System.out.println("Check1 : " + (c==d)); //prints "Check1 : true"
System.out.println("Check2 : " + a==b); //prints false. It didn't print the string "Check2 : "
System.out.println("Check3 : " +a.equals(b)); //prints "Check3 : true"
System.out.println(" c==d : " + c==d); //compile time error - incomparable types: java.lang.String and int
Большое спасибо.
3 ответа
Это из-за порядков операций, в этой части:
" c==d : " + c == d
Там нет скобок, поэтому компилятор идет:
(" c==d : " + c) == d
И вы получаете ошибку, потому что string == int
не определено. Это та же идея для другого примера:
"Check2 : " + a == b → ("Check2 : " + a) == b → "Check2 : Hai" == "Hai" → false
Вам нужно добавить скобки перед выполнением целочисленной операции
Делай так:
System.out.println(" c==d : " + (c==d));
Я постараюсь объяснить это один за другим.
System.out.println("Check1 : " + (c==d));
Это напечатает true
как есть int
сравнение и оба c
так же как d
имеет такое же значение.
System.out.println("Check2 : " + a==b);
Это печать false
потому что сцепленная строка Check2 :
+ a
не равно String b
, Если вы измените a==b
в (a==b)
тогда начнется печать true
Как оба a
а также b
указывает на ту же ссылку в пуле строк.
System.out.println("Check3 : " + a.equals(b));
Это напечатает true
потому что содержание строки a
равно содержанию строки b
,
System.out.println(" c==d : " + c==d);
Это выдаст ошибку, поскольку она будет проанализирована как строка c==d
соединенный с int c
преобразовано в строку (из-за перегрузки) равно int d
и, как вы знаете, мы не можем сравнивать String с Integer и, следовательно, это приведет к ошибке.