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 и, следовательно, это приведет к ошибке.

Другие вопросы по тегам