2010-04-28 4 views
4

Учитывая это:Пример ==, равно и хэш-код в Java

String s1= new String("abc"); 
String s2= new String("abc"); 
String s3 ="abc"; 
System.out.println(s1==s3); 
System.out.println(s1==s2); 
System.out.println(s1.equals(s2)); 
System.out.println(s1.equals(s3)); 
System.out.println(s1.hashCode()); 
System.out.println(s2.hashCode()); 
System.out.println(s3.hashCode()); 

Выхода:

false 
false 
true 
true 
96354 
96354 
96354 

== Здесь дают ложной для каждого объекта, но хэш-код для каждого объекта строки равно , Почему это так?

ответ

8

== делает сравнение реального равенства объектов (я имею в виду - обе ссылки указывают на один и тот же объект), а не их содержание, в то время как .equal сравнивает содержание (по крайней мере, для строки).

String a = new String("aa"); 
String b = new String("aa"); 

a и b указывают на различные объекты.

Обратите внимание, что если объекты равны, то их хэшшоды должны быть одинаковыми, но если хэш-коды одинаковы, это не означает, что объекты равны.

0

== подсказывает, ссылаются ли две ссылки на переменные на один и тот же объект в памяти, не более того. equals() и hashCode() оба рассматривают содержимое объекта, и каждый использует свой собственный алгоритм для вычисления.

7

В договоре с равными условиями говорится, что если o1.equals(o2), то o1.hashCode() == o2.hashCode(). Он ничего не говорит о хэш-кодах unequal объектов. У вас может быть такой метод, как

public int hashCode() 
{ 
    return 42; 
} 

и он выполнит контракт. Просто ожидается, что хэш-код будет связан со значением объекта, чтобы сделать таблицы хэша более эффективными.

Теперь, почему ваш == не работает, два объекта будут всегда сравниваться по ссылке. То есть, если o1 == o2, то o1 и o2 - это тот же самый объект. Это редко вы хотите; вы обычно хотите посмотреть, стоит ли вместо этого o1.equals(o2).

+0

+1 для ответа на вопрос, который был задан –

3

Когда вы используете ==, вы сравниваете, если две переменные содержат ссылку на один и тот же объект. Другими словами, s1 == s2 это как запрос: являются переменными s1 и s2, относящимися к одному и тому же объекту String? И это неверно, даже если оба объекта String имеют одинаковое значение «abc».

Когда вы используете equals(), вы сравниваете значение обоих объектов. Оба объекта могут быть не одинаковыми, но их значение (в данном случае «abc») одинаково, поэтому оно возвращает true.

0 Как определить, совпадает ли объект с другим? Это зависит от вас. В этом случае объект String уже определяет это для вас, но, например, если вы определяете объект Person, откуда вы знаете, если человек P1 равен P2? Вы делаете это, переопределяя equals() и hashCode().

Смежные вопросы