Map.Entry和map.get(key)有什么区别

时间:2019-09-10 07:25:31

标签: java

我担心哪种方法更好,Map.Entrymap.get(key),行的结构为List >,其代码如下:

for (Map<String, Object> row : rows) {
    Object stock = row.get("stock");
}

另一个:

for (Map<String, Object> row : rows) {
    for (Map.Entry<String, Object> cell : row.entrySet()) {
        if (cell.getKey().equals("stock")) {
            Object stock = cell.getValue();
        }
    }
}

哪个更好?

还有一个我很好奇的问题,我只知道一些键名,但不是全部,我想从映射中获取所有值,该怎么办?顺便说一句,我不想​​使用entrySet迭代器方法。

for (Map<String, Object> row : rows) {
   Object stock = row.get("stock");
  Object itemId = row.get("itemid");
  Object modelId = row.get("modelid");

   // todo
  // how to get other values that I don't know the key name String}

2 个答案:

答案 0 :(得分:3)

第一个代码段更好,因为您似乎只需要单个键的值。

使用row.get("stock")将花费恒定(O(1))的预期时间。

另一方面,迭代entrySet并将每个Map.Entry的密钥与所需密钥进行比较,将花费线性(O(n))时间,这比Map大时的第一个代码段。

仅在需要处理entrySet的所有条目时,才应遍历整个Map

答案 1 :(得分:3)

  

哪个更好?

通常,在编程中,没有通用性更好。事物总是取决于上下文。

已经说过,在编写代码时,您要努力以最少的代码(易于阅读和理解)来“做需要做的事情”。

从这个角度来看,您的第一个选择是明确的赢家。它可以完成工作,更易于阅读和维护(主要是因为您只看很少的代码)。作业所在的位置:遍历映射中的所有条目,并对每个值进行操作。

从“语义”的角度来看,这两个选项“做同样的事情”,因此它们几乎是等效的,我真的想不出一个示例,其中两个选项的行为不同(除了在运行时使用不同的 cost ,请参见其他答案)。