我们可以用动态键和动态值创建hashmap吗?

时间:2015-02-18 18:23:25

标签: java collections hashmap

我正在创建一个hashmap,如下所示:

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

我的密钥是动态的,价值也是动态的。

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

有可能吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

您还可以遍历entrySet()/ keySet()

答案 1 :(得分:1)

如果“动态密钥”表示密钥的内容在Map中发生变化,则答案是您必须非常小心。如果密钥的hashcode()值在地图中发生变化,则不会发生任何好事。如果你发生这种情况,那么使用密钥进行查找将无法找到该条目。

如果您让密钥的某些部分发生变化,但确保equals()hashcode()不会更改,那么查找将继续有效。我从未见过这在实践中得到实施。

我经常看到的是使用逻辑键的不变部分作为实际键。例如,我们可能有一个实体代表数据库中的一行,并包含一个不会更改的ID值。您可以将ID用作地图中的关键字(例如Map<Long, Value>而不是Map<Entity, Value>)。

这通常不起作用:

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());

答案 2 :(得分:0)

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

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