可以将Collection用作Hashmap java中的键吗?

时间:2018-04-06 13:05:31

标签: java design-patterns hashmap

我有以下方案(修改后的实际业务目的)。

  1. 我有一个程序可以预测一个人的卡路里含量 根据某些属性,在接下来的13周内松散。
  2. 我想将此结果缓存在数据库中,以便我不会调用 再次预测相同的组合。
  3. 我有上课的人 class Person { int personId; String weekStartDate; }
  4. 我有HashMap<List<Person>, Integer> - 关键是一个人的13周数据,值是预测
  5. 我会将哈希值保留在数据库中以用于缓存目的
  6. 有没有更好的方法来处理上述情况?任何支持此类场景的设计模式

3 个答案:

答案 0 :(得分:3)

取决于:hashCode()的实施使用列表中的元素。因此,稍后在上添加元素会更改该操作的结果:

public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

地图不能为更改其哈希值的密钥构建!当然,以不同方式实现该方法并不是真的有意义。

所以:当你的列表都是不可变的时,可以工作,这意味着列表或其任何成员都不会被修改 列表被用作关键。但是存在一定的风险:如果您稍后忘记了合同,并且这些列表看到了修改,那么您将遇到有趣的问题。

答案 1 :(得分:1)

这是有效的,因为标准List实现的哈希码是使用内容的哈希码计算的。但是,您需要确保在Person类中实现hashCodeequals,否则您将遇到相同的问题this guy had。另见我对这个问题的回答。

答案 2 :(得分:1)

我建议您定义一个类(比如Data)并将其用作hashmap中的键。相应地通过数周的数据知识覆盖equals/hashcode