【问题标题】:Can we create hashmap with dynamic key and dynamic value?我们可以创建具有动态键和动态值的哈希图吗?
【发布时间】:2015-04-19 21:26:03
【问题描述】:

我正在创建一个哈希图,如下所示:

HashMap <String,String> DtsFeed = new HashMap<String, String>();

我的键是动态的,值也是动态的。

DtsFeed.put(Request.getRequestId(), feedtype);

有可能吗?

【问题讨论】:

  • 都是String类型
  • 如果两者都是 String 类型,请使用泛型。 HashMap dtsFeed = new HashMap();
  • 究竟什么是“动态键”和“动态值”?
  • 你对HashMap了解多少?它禁止在添加条目后更改密钥(因为更改密钥涉及更改密钥的hashCode())。您可以通过这种方式更改密钥:map.put(newkey,map.remove(oldkey))(即删除旧条目然后添加新条目),直接更改您的密钥将破坏您的 HashMap。附言字符串在 java 中是不可变的,所以如果你不删除它,你的 HashMap 将包含所有带有旧键的条目。

标签: java collections hashmap


【解决方案1】:

您的示例有效,但我建议添加泛型虽然不是必需的。

HashMap<Object,Object> DtsFeed = new HashMap<>();
DtsFeed.put(key, value);
Object got = DtsFeed.get(key);

无论地图定义如何,Map.get() 始终适用于普通对象。

但请记住,您必须从地图中转换返回的结果才能使用它们。 (尽管您的解决方案具有潜在危险/不安全)

你也可以遍历 entrySet()/keySet()

【讨论】:

  • HashMap 插入后如何获取值?
【解决方案2】:

你的意思是键和值都可以改变吗?您可以考虑使用 IdentityHashMap,它使用引用而不是 hashCode() 和 equals() 来比较键。

使用 IdentityHashMap,您始终可以检索与键关联的值,即使该键可以更改状态。

【讨论】:

    【解决方案3】:

    如果“动态键”是指键的内容在 Map 中时发生变化,那么答案是你必须非常小心。如果键的hashcode() 值在映射中发生更改,则不会发生任何好事。如果您让这种情况发生,那么使用该键的查找将无法找到该条目。

    如果您让密钥的某些部分更改,但确保 equals()hashcode() 不更改,则查找将继续工作。我从未在实践中看到过这种做法。

    我经常看到的做法是使用逻辑键的不变部分作为实际键。例如,我们可能有一个实体,它表示数据库中的一行,并包含一个不会更改的 ID 值。您可以使用 ID 作为映射中的键(例如,Map&lt;Long, Value&gt; 而不是 Map&lt;Entity, Value&gt;)。

    这通常不起作用:

    Map<Entity, Value> map = new HashMap<>();
    Entity entity = ...
    Value value = ...
    map.put(entity, value);
    entity.setA(a);
    Value willBeNull = map.get(entity);
    

    这通常有效:

    Map<Long, Value> map = new HashMap<>();
    Entity entity = ...
    Value value = ...
    map.put(entity.getId(), value);
    entity.setA(a);
    Value willBeTheExpecteValue = map.get(entity.getId());
    

    【讨论】:

    • 我看过并使用过。只要对象身份是不可变的(并且equalshashcode 仅依赖于此)- 就很好。一个常见的用例是由时间戳和 id(演员或对象)标识的事件。
    猜你喜欢
    • 2015-04-20
    • 2015-08-15
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多