powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / equals() and hashCode()
13 сообщений из 13, страница 1 из 1
equals() and hashCode()
    #37648220
benao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каких ситуациях методы будут возвращать одинаковые хэшкоды?
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37648250
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Не методы, а метод - hashCode(), только он возвращает хэщкоды, equals() тут ни при чем.
2) Одиноавые значения будут возвращены тогда ... когда алгоритм вернет одинаковые значения Т.е. это зависит только от того, как вы реализуете hashCode()
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37648259
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
benao,
если про equals то он определяет разницу объектов по адресу.
Если не переопределить логику, то это просто говорит, что адрес одинаков = одна переменная.
Для смысла надо переопределить equals
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37648886
jab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переопределять надо, чтоб возвращало то что нужно.
Вот немного можно посмотреть http://www.askdev.ru/java/1689/%D0%9F%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-override-equals-%D0%B8-hashCode/
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37648936
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
loop
Откройте исходники класса Object.java,
почитайте про контракты для методов equals, hashcode,
В голове чуть прояснится но не совсем,
затем скачайте книгу Блоха Effective Java 2 ed, почитайте пункты про equals hashcode
end loop
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37649573
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
benaoВ каких ситуациях методы будут возвращать одинаковые хэшкоды?
я вам помогу сформулировать вопрос и дать ответ(да, я экстрасенс):
Вопрос:
Когда методы hashCode() для двух объектов - обязан возвращать одинаковый хешкод.


Ответ:
Когда метод equals - для этих объектов вернет true.

или проще говоря, если объекты равны - то их хешкод обязан совпадать, иначе работа со всякими хешмапами и хешсетами - будет некорректной.
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37649676
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNОтвет:
Когда метод equals - для этих объектов вернет true.
или проще говоря, если объекты равны - то их хешкод обязан совпадать, иначе работа со всякими хешмапами и хешсетами - будет некорректной.
Неверно, так как:
1) hashCode() может быть одинаковым и у разных объектов
2) Даже если hashCode() у двух одинаковых объектов возвращает разные значения, ничего страшного с HashMap и HashSet не случиться, они будут работать корректно . Дргуое дело, что они могут работать неэффективно , но разница между понятие "некорректно" и "неэффективна" огромна.
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37649701
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomZyK_BotaNОтвет:
Когда метод equals - для этих объектов вернет true.
или проще говоря, если объекты равны - то их хешкод обязан совпадать, иначе работа со всякими хешмапами и хешсетами - будет некорректной.
Неверно, так как:
1) hashCode() может быть одинаковым и у разных объектов
2) Даже если hashCode() у двух одинаковых объектов возвращает разные значения, ничего страшного с HashMap и HashSet не случиться, они будут работать корректно . Дргуое дело, что они могут работать неэффективно , но разница между понятие "некорректно" и "неэффективна" огромна.


Нельзя так категорично комментировать жы;)
1) не противоречит , а у equals объектов hashcode, тем не менее, обязан совпадать
2) хоть бы прокомментировали , что под неэффективностью чаще всего подразумевается скорость "доступа" к элементу.
2.1) некорректность вдруг может проявится, когда мутабл объект используют в качестве ключа и hashcode рассчитывается по полям этого объекта.
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37649749
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public class Entity {
    private Integer id;

    public Entity() {

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

   public boolean equals(Object obj) {
        return ((Entity)obj).getId()==this.getId();

   }
    
   public int hashCode() {
       return 31*id;
   }
}

//hashcode тесты
    private void hashCodeTest() {
        Entity e = new Entity();
        HashSet<Entity> hashSet = new HashSet<Entity>();

        System.out.println("e.setId(1);");
        e.setId(1);

        System.out.println("hashSet.add(e);");
        hashSet.add(e);

        System.out.println("e.setId(2);");
        e.setId(2);


        System.out.println("hashSet.contains(e);" + hashSet.contains(e));
        hashSet.contains(e);

    }



e.setId(1);
hashSet.add(e);
e.setId(2);
hashSet.contains(e);false

Ну вот как-то так.
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37649918
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За это
Код: java
1.
return ((Entity)obj).getId()==this.getId();

извиняюсь ) Вернулся, глянул, заменил на
Код: java
1.
return ((Entity)obj).getId().equals(this.getId());


результат не поменялся
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37650303
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom2) Даже если hashCode() у двух одинаковых объектов возвращает разные значения, ничего страшного с HashMap и HashSet не случиться,
ты заблуждаешься.
не эффективно будет работать, если для большинства разных обектов - будет возвращаться одинаковый хеш.

а в случае разного хеша для одинаковых - работа будет не корректна
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37650404
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenom,

вот тебе даже код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class A {
	public A(int f) {
		this.f = f;
	}
	private int f;
	
	public boolean equals(Object o) {
		return true;
	}
	
	public int hashCode() {
		return f;
	}

}
public class Test {
	
	public static void main(String[] args) throws SecurityException, NoSuchFieldException {
		HashSet<A> set = new HashSet<A>();
		set.add(new A(3));
		System.out.print(set.contains(new A(2)));
	}

}



напечатает "false"

а если переписать хеш так:
Код: java
1.
2.
3.
	public int hashCode() {
		return f;
	}


то на консоль будет выведено - "true"
...
Рейтинг: 0 / 0
equals() and hashCode()
    #37650425
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNsvenom2) Даже если hashCode() у двух одинаковых объектов возвращает разные значения, ничего страшного с HashMap и HashSet не случиться,
ты заблуждаешься.
не эффективно будет работать, если для большинства разных обектов - будет возвращаться одинаковый хеш.

а в случае разного хеша для одинаковых - работа будет не корректнаДа, все верно, ваша правда.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / equals() and hashCode()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]