2015-10-20 2 views
0

У меня есть следующая ситуация:Java HashSet и HashCode для пользовательского объекта, который содержит список

public class CustomClass { 
     private LinkedList<ActionClass> actionList; 
     private MyReaderClass reader; //methods... 
     //other methods... 
     hashcode() 
     equals() 
     //blabla 
    } 

Теперь я использовать customclass внутри HashSet, но я не понимаю, если это необходимо внедрение методов hashcode и равно также внутри ActionClass из-за того, что он содержится внутри связанного списка, который я использовал. Спасибо за ответы

+0

Ваш вопрос очень неясен. Пожалуйста, вы можете расширить свой примерный код, чтобы показать, как вы используете «CustomClass» более конкретно. –

ответ

0

Да, если вы хотите использовать CustomClass в качестве элемента коллекции HashSet, вам необходимо предоставить метод hashCode. И чтобы получить действительно уникальный хеш-код для вашего объекта, вам нужно рассчитать его, включая хэш-коды всех объектов. В вашем случае, включая хэш-код actionList.

Благодаря JavaDoc для List#hashCode():

Возвращает значение хэш-кода для этого списка. Хэш-код списка определяется как результат следующего расчета:

int hashCode = 1; 
for (E e : list) 
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 

Это означает, что вы должны предоставить hashs (hashCode() реализации) для ActionClass также для того, чтобы вычислить хэш-код для коллекции.

То же самое верно и для List#equals(), если вы хотите добавить свой класс в некоторые другие коллекции, которые не требуют хэша объекта:

Сравнивает указанный объект с этим списком для равенства. Возвращает true тогда и только тогда, когда указанный объект также является списком, оба списка имеют одинаковый размер, и все соответствующие пары элементов в двух списках равны.

Вы должны обеспечить реализацию equals() метода в вашем ActionClass, чтобы сделать 2 переменные типа LinkedList<ActionClass> сопоставимого друг с другом.

Конечно, вы можете избежать использования actionList поля в equals() и hashCode() реализации CustomClass, если вы уверены, что это значение не omportant для CustomClass. Но в любом случае, это «хороший стиль», чтобы обеспечить реализацию обоих этих методов в ваших классах.

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