powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HashSet
10 сообщений из 10, страница 1 из 1
Вопрос по HashSet
    #39113933
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
Set set = new HashSet();
        set.add(new Person("Joe", 33, 400));
        set.add(new Person("Kris", 25, 300));
        set.add(new Person("Julia", 30, 100));
        set.add(new Person("Julia", 30, 100));

        System.out.println(set);



Как известно, для сравнения объектов HashSet использует equals, я переопределила его, согласно моей бизнес логике Person равны, когда равны номера паспортов. Т.е.

Код: 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.
public static class Person implements Comparable<Person> {
        private int age;
        private String name;
        private int passportCode;


        public Person(String name, int age, int passportCode) {
            this.age = age;
            this.name = name;
            this.passportCode = passportCode;
        }


        @Override
        public boolean equals(Object obj) {
            boolean result = false;
            Person p = (Person)obj;
            if(p.passportCode == this.passportCode){
                result = true;
            }
            return result;
        }


        @Override
        public int compareTo(Person o) {
           if(this.passportCode < o.passportCode){
                return -1;
            } else if(this.passportCode > o.passportCode){
                return 1;
            } else {
                return 0;
            }
        }


        @Override
        public String toString() {
            return "Name: " + name + " age: " + age + " passportCode: " + passportCode +" ---- ";
        }
    }


Но почему-то выдает все объекты в консоль:
Код: java
1.
[Name: Joe age: 33 passportCode: 400 ---- , Name: Julia age: 30 passportCode: 100 ---- , Name: Julia age: 30 passportCode: 100 ---- , Name: Kris age: 25 passportCode: 300 ---- ]


Почему две Julia?
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113945
Andrew1411
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT
Как известно, для сравнения объектов HashSet использует equals, я переопределила его, согласно моей бизнес логике Person равны, когда равны номера паспортов.


Почему две Julia?
потому что хешкоды разные. сравнение идет только в том случае, когда хешкоды одинаковые
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113946
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTКак известно, для сравнения объектов HashSet использует equals
Как известно, JavaDoc к классу java.lang.Object стоит знать.
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113963
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT, современные IDE могут сгенерить тебе реализацию hashCode(). Не всегда
она идеальна но в твоём случае сойдет.
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113972
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ок, сделала так:
Код: java
1.
2.
3.
4.
@Override
        public int hashCode() {
            return 0;
        }


все, естественно, заработало. НО!
при одинаковом хэш коде, если я захочу, например, добавить свои данные в коллекцию типа хеш, все они будут скапливаться в одной корзине, что по сути приведет к тому, что моя хэш коллекция выродится в List. Как быть?
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113973
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, сорри, я ведь могу сделать хеш завязанный на passportCode
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113993
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTа, сорри, я ведь могу сделать хеш завязанный на passportCode
а так же на age и на name
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39113998
Andrew1411
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

хешкод и иквалс взаимосвязанные

если иквалс дает истину - то хешкоды должны быть одинаковыми
если хешкоды разные - иквалс должен обязательно давать ложь

ну и естественный результат - когда хешкоды одинаковы, а иквалс ложь


несоблюдение правил приведет к проблемам хешколлекций

и еще, у объекта, помещенного в хеш коллекцию не должен меняться хешкод, иначе не получиться найти объект, потому что он будет искать в корзине, соответствующей новому хешу, а он будет валяться в другой корзине.

для ознакомления можно почитать http://habrahabr.ru/post/168195/
раз уж гугл забанен :)
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39114032
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulTа, сорри, я ведь могу сделать хеш завязанный на passportCode
а так же на age и на name
+
...
Рейтинг: 0 / 0
Вопрос по HashSet
    #39114041
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew1411JulT,

хешкод и иквалс взаимосвязанные

если иквалс дает истину - то хешкоды должны быть одинаковыми
если хешкоды разные - иквалс должен обязательно давать ложь

ну и естественный результат - когда хешкоды одинаковы, а иквалс ложь


несоблюдение правил приведет к проблемам хешколлекций

и еще, у объекта, помещенного в хеш коллекцию не должен меняться хешкод, иначе не получиться найти объект, потому что он будет искать в корзине, соответствующей новому хешу, а он будет валяться в другой корзине.

для ознакомления можно почитать http://habrahabr.ru/post/168195/
раз уж гугл забанен :)
Спасибо)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HashSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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