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

i07*_*707 1 java design-patterns hashmap

我有以下场景(比实际业务目的修改了一个)。

  1. 我有一个程序可以根据某些属性预测一个人在接下来的 13 周内会消耗多少卡路里。
  2. 我想将此结果缓存在数据库中,以便我不会再次调用相同组合的预测。
  3. 我有课人 class Person { int personId; String weekStartDate; }
  4. 我有HashMap<List<Person>, Integer>- 关键是一个人的 13 周数据,值是预测
  5. 我会将哈希值保留在数据库中以用于缓存目的

有没有更好的方法来处理上述情况?任何支持此类场景的设计模式

Gho*_*ica 5

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

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

映射不是为可以更改其哈希值的键构建的!当然,以不同的方式实现该方法实际上没有意义。

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