2014-01-09 2 views
-5

Я попытался с помощью следующего класса:Сравнение строк в Java не дает желаемых результатов

public class EqualMethodTestWithNew { 
    public static void main(String[] args) { 
     String value = "xxx"; 
     String name = new String("xxx") ; 

     System.out.println("hascode : value : "+value.hashCode()); 
     System.out.println("hascode : name : "+name.hashCode()); 

     if (value == name) { 
      System.out.println("equal == 1"); 
     } else { 
      System.out.println("false == 1"); 
     } 

    } 
} 

хотя hasCode одинакова для обоих переменной она печатает false == 1. Может кто-нибудь объяснить причину?

благодаря

+3

@ ᴍarounᴍaroun У нас должно быть всплывающее окно «Это вопрос о равенстве строк?» При публикации нового вопроса !!! –

+1

@NarendraPathai Я думаю, что у нас должна быть функция «авто-удар», которая появляется с экрана, когда кто-то спрашивает о '==' vs 'equals'. – Maroun

+0

@ ᴍarounᴍaroun Это было бы так удобно: D и fun tooo. Я задавал бы этот вопрос и каждый день получал удар;) –

ответ

1

Вам нужно понять, что именно происходит при выполнении двух строковых операторов.

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) {.

1

Строка должна быть по сравнению с equals() методом, не ==. Вы пытаетесь проверить равенство адреса памяти обоих экземпляров (фактически это не так) вместо значения в экземплярах String. Таким образом, используйте

if(value.equals(name)) { 
    System.out.println("equal == 1"); 
} 
+0

@Maroun Спасибо за ваше редактирование – Keerthivasan

0

Строки сравниваются с использованием метода equal(). == сравнивает два одинаковых объекта.

1

Вы должны использовать метод equals вместо == opertaor.

if (value.equals(name)) { 
    System.out.println("equal == 1"); 
} else { 
    System.out.println("false == 1"); 
} 

Обратите внимание, что:

== tests for reference equality. 

.equals() tests for value equality. 

Пожалуйста, смотрите here для получения дополнительной информации.

1

Причина, по которой ваш код не работает, заключается в том, что == проверяет, является ли ссылка на объект одинаковой, и это не ваш случай. Чтобы сравнить значение строки, вам необходимо использовать метод .equals(String str).

if (value.equals(name)) { 
    ... 
} 
Смежные вопросы