Вам нужно понять, что именно происходит при выполнении двух строковых операторов.
String value = "xxx";
выше строка создает новую компиляции постоянной строку, которая делает в String intern pool.
String name = new String("xxx") ;
Но в этом случае, так как вы используете оператор new
, он создает новый объект String, который идет в куче объектов. Он не имеет того же адреса, что и тот, который был создан в предыдущем отчете.
Метод hashCode()
основан на содержимом строки, которые являются одинаковыми, но это не означает, что они оба относятся к одному и тому же объекту String в памяти.
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] // would return same value for all String objects having the same content
Для сравнения значений, вам нужно использовать метод equals()
.
И если вы хотите сравнить ссылки на объекты, используйте оператор ==
. В вашем случае, поскольку оба относятся к разностным объектам, вы получаете вывод как false
.
В качестве альтернативы вы можете попросить компилятор проверить и получить ссылку на строку String с тем же значением, уже существующим в пуле строк, с помощью метода intern()
.
String value = "xxx";
String name = new String("xxx");
name = name.intern(); // getting reference from string pool
Теперь вы получите выход в equal == 1
когда ваш делать if (value == name) {
.
@ ᴍarounᴍaroun У нас должно быть всплывающее окно «Это вопрос о равенстве строк?» При публикации нового вопроса !!! –
@NarendraPathai Я думаю, что у нас должна быть функция «авто-удар», которая появляется с экрана, когда кто-то спрашивает о '==' vs 'equals'. – Maroun
@ ᴍarounᴍaroun Это было бы так удобно: D и fun tooo. Я задавал бы этот вопрос и каждый день получал удар;) –