我有一个包含对象列表的数据结构,如下所示:
class A { private List<Object> list; }
假设列表的每个元素都有一个正确的hashCode(),如何正确地为列表定义一个哈希函数?
hashCode()
dm7nw8vv1#
如果实际的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文件)List接口要求一致的实现根据列表的元素提供equals,因此,他们必须明确地指定hashCode算法
equals
oiopk7p52#
为什么要为列表定义hashCode,而它已经实现了(和equals一起)?(当然前提是它是java.util.List--如果不是,上面的链接会向您展示可以用于您自己的列表类型的确切实现。)
java.util.List
rkue9o1l3#
列表的哈希码由List的List接口定义。它可以用作对象哈希码的一部分,尽管有几种情况你可能不想使用它--如果你的列表元素有一个昂贵的哈希码函数,或者如果列表可以保存对对象的引用,如果使用列表的算法,你会得到堆栈溢出。在这种情况下,仅使用列表的长度或另一散列值。
mdfafbf14#
在Java库中,List实现(LinkedList、ArrayList)使用AbstractList提供的默认hashCode实现,其定义为:
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;
nwsw7zdq5#
你不愿意做的具体原因:
Arrays.hashCode(<cast list to array>);
比如:
Arrays.hashCode((String []) myList.toArray());
cig3rfwq6#
也许问题应该是“如何计算包含列表的对象的散列码”。
class A { private List<Object> list; @Override public int hashCode() { return list.hashCode(); } // ... don't forget to implement custom equals ... }
6条答案
按热度按时间dm7nw8vv1#
如果实际的
List
实现与接口完全一致,那么提供的hashCode
实现就足够了:返回此列表的哈希代码值。列表的哈希代码定义为以下计算的结果:
(List文件)
List
接口要求一致的实现根据列表的元素提供equals
,因此,他们必须明确地指定hashCode
算法oiopk7p52#
为什么要为列表定义
hashCode
,而它已经实现了(和equals
一起)?(当然前提是它是
java.util.List
--如果不是,上面的链接会向您展示可以用于您自己的列表类型的确切实现。)rkue9o1l3#
列表的哈希码由List的List接口定义。它可以用作对象哈希码的一部分,尽管有几种情况你可能不想使用它--如果你的列表元素有一个昂贵的哈希码函数,或者如果列表可以保存对对象的引用,如果使用列表的算法,你会得到堆栈溢出。在这种情况下,仅使用列表的长度或另一散列值。
mdfafbf14#
在Java库中,
List
实现(LinkedList
、ArrayList
)使用AbstractList
提供的默认hashCode
实现,其定义为:nwsw7zdq5#
你不愿意做的具体原因:
比如:
cig3rfwq6#
也许问题应该是“如何计算包含列表的对象的散列码”。