Пример ==, равно и хэш-код в Java - PullRequest
5 голосов
/ 28 апреля 2010

Учитывая это:

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

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

Ответы [ 4 ]

9 голосов
/ 28 апреля 2010

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

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

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

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

8 голосов
/ 28 апреля 2010

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

public int hashCode()
{
    return 42;
}

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

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

3 голосов
/ 28 апреля 2010

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

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

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

0 голосов
/ 28 апреля 2010

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

...