【问题标题】:HashMap Java get value if it existsHashMap Java 如果存在则获取值
【发布时间】:2017-04-03 07:03:37
【问题描述】:

我希望从 HasMap 中获取一个值,但有时该值不存在,所以我这样做了:

int var = 0;
if (hashMapHouse.containsKey("home1") {
    var = hashMapHouse.get("houme1");
}
if(var==0) //do something
else //do something else

我的问题是:是否可以调用一次 hashMap 来获取值并测试该值是否存在?

【问题讨论】:

    标签: java dictionary data-structures hashmap


    【解决方案1】:

    在 Java 8 中,您可以使用 getOrDefault 方法:

    int var = hashMapHouse.getOrDefault("home1", 0);
    

    这是最简洁的解决方案,您可以在一行中获取键的值(如果存在),或者预定义的默认值以指示它不存在 - 在这种情况下为 0。

    【讨论】:

    • 如果 HashMap 的值不是 int 而是一个对象是类似的方式来做到这一点 (int var = hashMapHouse.getOrDefault("home1", 0);)?
    • 是的,你为什么不测试一下?
    【解决方案2】:

    没问题

    Integer houme = hashMapHouse.get("houme1");
    
    if (null == houme ) {
        // not exists 
    } else {
        // exists 
    } 
    

    【讨论】:

    • 但我希望也有 hashMapHouse 的值
    • HashMap 可以允许空值,因此检查空值并不能保证键不存在。
    • @getITdone 好吧,在 OP 的情况下,int 无论如何都不能成为 HashMap 中的值
    【解决方案3】:

    来自docs:

    返回值为 null 并不一定表示该映射不包含该键的映射;映射也可能将键显式映射为空。 containsKey 操作可以用来区分这两种情况。

    如果您不使用null 作为值,那么您可以使用get() 方法一次,然后像这样:

    Integer var = hashMap.get(key);
    if (var != null) {
        // value exists
    }
    

    【讨论】:

    • 谁(请提供链接)“不推荐”该方法,他们推荐的是什么?鉴于大多数建议是不要将null 存储在地图中(尤其是因为某些地图甚至不允许这样做),为什么不建议依赖get() 返回null 表示“未找到”,因为它优于必须先调用containsKey()?
    • @Andreas 我们可以在Map 中明确地将null 与key 保持一致。因此,如果 OP 是这种情况,那么仅使用 get() 来确定 key-value 是否存在并不是一个好主意。如果我错了,请纠正我
    • 如果地图将包含空值,调用get()将无法区分“缺失”和“有空”。如果您需要知道区别,那么是的,您需要致电containsKey()。大多数时候,地图不会包含空值(尤其是在使用不允许它的地图时),因此在这些情况下没有歧义。 ---但这不是重点。你说“这不是推荐的方法”,我问你谁提出了这个建议,因为我没有见过/听说过以前。
    • @Andreas 好的,我同意我在没有支持的情况下给出了我的意见。我会删除它
    • 发表您的意见是可以的,但您应该用措辞来表达,以便人们知道这是您的意见。您曾将其表述为普遍接受的建议。相反,你可以说“但我不推荐它,因为......”,或者类似的话。
    【解决方案4】:

    可以边检查条件边取值,避免两次访问HashMap。

    if ((temp = hashMapHouse.get("home1") != null) {
        var = temp;
    }
    

    在我们验证条件的同时设置临时变量。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2019-05-16
      • 1970-01-01
      • 2022-12-15
      • 2010-11-25
      • 2021-12-21
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多