有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

可能吗


共 (3) 个答案

  1. # 1 楼答案

    您的示例很有效,但我建议添加泛型,尽管这不是必需的

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

    地图。get()始终适用于普通对象,而不管贴图定义如何

    但是请记住,为了使用它们,您必须从映射中强制转换返回的结果。(但您的解决方案存在潜在危险/不安全)

    您还可以迭代entrySet()/keySet()

  2. # 2 楼答案

    如果“动态键”意味着键的内容在地图中时会发生变化,那么答案是您必须非常小心。如果键的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());
    
  3. # 3 楼答案

    您的意思是键和值都可以更改吗?您可以考虑IdditHasMMAP,它使用它们的引用而不是HASCODE()和均衡器()来比较键。p>

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