首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合可以用作Hashmap java中的密钥吗?

集合可以用作Hashmap java中的密钥吗?
EN

Stack Overflow用户
提问于 2018-04-06 13:05:31
回答 3查看 535关注 0票数 1

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

  1. 我有一个程序,根据特定的属性预测一个人在接下来的13周里会减少多少卡路里。
  2. 我希望将这个结果缓存在数据库中,这样就不会再次调用相同组合的预测。
  3. 我有课堂人物class Person { int personId; String weekStartDate; }
  4. 我有HashMap<List<Person>, Integer> -关键是一个人的13周数据,值是预测。
  5. 我将将哈希值保存在数据库中,以实现缓存目的。

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

EN

回答 3

Stack Overflow用户

发布于 2018-04-06 13:11:51

依赖:hashCode()的实现使用列表中的元素。因此,稍后在上添加元素会更改操作的结果:

代码语言:javascript
复制
public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

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

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

票数 5
EN

Stack Overflow用户

发布于 2018-04-06 13:10:44

这是因为标准列表实现的哈希代码是用内容的哈希代码计算的。但是,您需要确保在Person类中也实现hashCodeequals,否则您将得到相同的问题这家伙。也见我对这个问题的回答。

票数 1
EN

Stack Overflow用户

发布于 2018-04-06 13:25:34

我建议您定义一个类(比如Data),并在您的hashmap中使用它作为键。因此,使用数周的数据知识覆盖equals/hashcode

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49693515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档