2017-01-24 14 views
4

Так что это больше вопрос «попытаться понять», чем вопрос «Мне нужно решение». Для задания мы попросили создать Список продуктов, которые имеют itemNumber и price, но только один из них, поэтому нет элемента с тем же itemNumber. Я решил, что смогу создать набор и избавиться от проблемы с дубликатами. Но если я добавлю producta 1, 4.99 и productb 1, 2.99, оба продукта будут добавлены.Когда набор позволяет дублировать?

Означает ли это, что набор определяет, что эти продукты отличаются друг от друга, они имеют разную цену и поэтому могут быть добавлены в набор?

+1

Какую настройку вы используете? – Eran

+4

Wether or not a Set считает, что два объекта равны (обычно) в зависимости от реализации класса объектов hashCode и hashCode. Вы реализовали/переопределили эти 2 метода в своем классе Product? –

+1

@NikRawlins, если у вас есть java.util.HashSet продукта (ов), вам нужно определить equals/hashcode. В противном случае (jdk-8 мудрый) hashcode вычисляется с помощью реализации masrsaliag xor shift, а hashcode - Identity hashcode - который, вероятно, не то, что вы хотите – Eugene

ответ

5

Предполагаете, что вы используете форму java.util.Set. Наборы в java используют метод equals для сравнения двух объектов. Вы хотите переопределить метод equals для класса, который вы хотите сравнить (Product), чтобы сообщить набору, что они равны, когда номера позиций совпадают.

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

Edit: Как уже упоминалось 911DidBush и Тодд Сьюэлл, всякий раз, когда вы переопределить метод Equals вы также хотите, чтобы переопределить метод Hashcode, чтобы не нарушать договор хэш-код.
Из Java документ:

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

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

+3

вы должны добавить, что метод hashCode также должен быть переопределен. Только переопределение метода equals, а затем попытка использовать его в HashSet, например, является рецептом для катастрофы. –

+2

"Если вы используете HashSet, вы также захотите переопределить метод hashCode' -> Нет! Если вы переопределяете равные, вы * должны * переопределять 'hashcode', чтобы соответствовать контракту' equals'. –

+1

Этот ответ в сочетании с комментариями помог мне понять, спасибо за ваши ответы! –

5

Цитата из Set javadoc:

Коллекция, не содержит повторяющихся элементов. Более формально множества не содержат пары элементов e1 и e2 таких, что e1.equals (e2) и не более одного нулевого элемента.

Как вы можете видеть, независимо от того, считаются или нет два объекта одинаковыми, определяется путем вызова соответственно названного метода equals. Имейте в виду, что когда вы реализуете equals, вы также должны реализовать hashcode, как описано here и в equals javadoc.