У меня есть структура данных, содержащая список объектов, например:
class A { private List<Object> list; }
Как правильно определить хэш-функцию для списка, предполагая, что каждый элемент списка имеет правильный hashCode()?
hashCode()
Если фактическая реализация List полностью соответствует интерфейсу, предоставленной реализации hashCode должно быть достаточно:
List
hashCode
Возвращает значение хэш-кода для этого списка.Хеш-код списка определяется как результат следующих вычислений:
hashCode = 1; Iterator i = list.iterator(); while (i.hasNext()) { Object obj = i.next(); hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); }
( Список документации )
Интерфейс Listтребует соответствующих реализаций для предоставления equals на основе элементов списка.Таким образом, они должны были явно указать алгоритм hashCode
equals
Почему вы хотите определить hashCode для своего списка, когда он уже реализовал (вместе с equals)?
(При условии, что java.util.ListКонечно, но если нет, то приведенная выше ссылка показывает точную реализацию, которую вы можете использовать для своего собственного типа списка.)
java.util.List
Любая конкретная причина, по которой вы просто не сделаете:
Arrays.hashCode(<cast list to array>);
Что-то вроде:
Arrays.hashCode((String []) myList.toArray());
В библиотеке Java реализации List (LinkedList, ArrayList) используют реализацию hashCode по умолчанию, предоставленную AbstractList. который определяется как:
LinkedList
ArrayList
AbstractList
int hashCode = 1; Iterator<E> i = iterator(); while (i.hasNext()) { E obj = i.next(); hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); } return hashCode;
Хеш-код списка определяется интерфейсом List List.Это может быть использовано как часть хеш-кода вашего объекта, хотя есть пара случаев, когда вы не захотите его использовать - если элементы вашего списка имеют дорогостоящую функцию хеш-кода или если список может содержать ссылкуобъект, и вы получите переполнение стека, если используется алгоритм списка.В этом случае просто используйте длину списка или другое хеш-значение.