ArrayList自定义类作为HashMap键

时间:2011-07-21 11:45:17

标签: java hashmap

4 个答案:

答案 0 :(得分:4)

您不能将数组用作键,因为数组具有来自hashCode的默认实现equalsObjects,并且它不会考虑它的元素。

要使其工作,您必须覆盖数组的hashCodeequals,但您无法做到。

您可以使用ArrayList,因为它会实现hashCode结束equals比较元素。

答案 1 :(得分:1)

您在每次迭代时都将相同的数组实例keyPts存储到HashMap中(并覆盖其内容)。

答案 2 :(得分:1)

正如Jim在他的(删除)答案中所说,你在地图中多次放置相同的关键对象,这将导致替换之前的值。

但是为每个元素添加一个新数组也不会更好 - 那么你将拥有更多的键值对,但是如果你不能通过get方法访问它们拥有正确的数组对象(然后你也可以得到这个值),因为数组没有实现.equalshashCode

提出解决方案:您可以使用List<Point>作为密钥类型,并为每对关键点使用新列表。将其作为键放入地图后,请确保不要修改列表。 (您可以通过Collections.unmodifiableList将其包装起来以确保这一点。)

另一种选择是自定义的一对点类(使用自己的hashCode和equals实现)。

答案 3 :(得分:0)

当您使用数组作为哈希映射的键时,该数组的hashCode方法用于确定键的哈希值,而不是您的Point类。

对于您的具体情况,我会尝试使用地图地图:Map<Point, Map<Point, Double>>或带有2个键和值的自定义2D矩阵类。