Разница между == и equals смущала меня какое-то время, пока я не решил рассмотреть его поближе.Многие из них говорят, что для сравнения строк следует использовать equals
, а не ==
.Надеюсь, в этом ответе я смогу сказать разницу.
Лучший способ ответить на этот вопрос - задать себе несколько вопросов.Итак, начнем:
Каков вывод для следующей программы:
String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);
, если вы скажете,
false
true
Я скажуты прав но почему ты сказал это ?и если вы скажете:
true
false
Я скажу, что вы ошибочны , но я все равно спрошу вас, почему вы думаете, что это правильно?
ХорошоДавайте попробуем ответить на этот вопрос:
Каков вывод для следующей программы:
String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);
Теперь Если вы говорите,
false
true
Я скажу, что вы не правы но почему это неправильно сейчас ?правильный вывод для этой программы
true
false
Пожалуйста, сравните вышеуказанную программу и попытайтесь подумать об этом.
ОК.Теперь это может помочь (пожалуйста, прочитайте это: напечатайте адрес объекта - невозможно, но мы все равно можем его использовать.)
String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));
Вы можете просто попытаться подумать о выводепоследние три строки в коде выше: для меня ideone распечатал это ( вы можете проверить код здесь ):
false
true
true
false
mango mango
false
true
17225372
17225372
5433634
О!Теперь вы видите, что identityHashCode (mango) равно identityHashCode (mango2), но оно не равно identityHashCode (mango3)
Даже если все строковые переменные - mango, mango2 и mango3 -иметь такое же значение, которое равно "манго", identityHashCode()
все еще не одинаково для всех.
Теперь попробуйте раскомментировать эту строку // mango2 = "mang";
и запустите ее снова, на этот раз выувидим все три identityHashCode()
разные.Хм, это полезная подсказка
мы знаем, что если hashcode(x)=N
и hashcode(y)=N
=> x is equal to y
Я не уверен, как внутренне работает Java, но я предполагаю, что это то, что произошло, когдаЯ сказал:
mango = "mango";
java создал строку "mango"
, на которую указывала (ссылалась) переменная mango
что-то вроде этого
mango ----> "mango"
Теперь в следующей строке, когда ясказал:
mango2 = "mango";
Он фактически использовал одну и ту же строку "mango"
, которая выглядит примерно так
mango ----> "mango" <---- mango2
И манго, и манго2 указывают на одну и ту же ссылку. Теперь, когда я сказал
mango3 = new String("mango")
Он фактически создал совершенно новую ссылку (строку) для "манго".который выглядит примерно так:
mango -----> "mango" <------ mango2
mango3 ------> "mango"
, и поэтому, когда я выставляю значения для mango == mango2
, он выдает true
.и когда я выводил значение для mango3 == mango2
, он выдавал false
(даже когда значения были одинаковыми).
и когда вы раскомментировали строку // mango2 = "mang";
Это фактически создало строку "mang"который перевернул наш график следующим образом:
mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"
Вот почему identityHashCode не одинаков для всех.
Надеюсь, это поможет вам, ребята.На самом деле, я хотел сгенерировать тестовый пример, где == не выполняется и равно () пройти.Пожалуйста, не стесняйтесь комментировать и дайте мне знать, если я ошибаюсь.