在 HashMap 中获取元素子集的有效方法是什么?

What is an efficient way to obtain a subset of elements in a HashMap?

我需要从函数中 return HashMap 的一个子集。那么什么是更好的方法或最有效的方法:

一个。遍历 HashMap 键,无论哪个符合我的条件,将它们添加到本地创建的 HashMap 和 return it

b。克隆 HashMap 并使用 retainAll 方法。

即:

private HashMap<Long, List<Files>> abc(HashMap<Long, List<Files> mainMap, Set<Long> setNeeded){
    HashMap<Long, List<Files>> retVal = new HashMap<Long, List<Files>>(mainMap);
    for(Long timeStamp : mainMap.keySet()){
      if(setNeeded.contains(timeStamp){
        retVal.put(timeStamp, mainMap.get(key));
      }
    }
  return retVal;
}

private HashMap<Long, List<Files>> abc(HashMap<Long, List<Files> mainMap, Set<Long> setNeeded){
    HashMap<Long, List<Files>> retVal = new HashMap<Long, List<Files>>(mainMap);
    retVal.retainAll(setNeeded);
    return retVal;
}

或者既优化又高效?

一个。将在原始地图上进行一次传递,并仅将您想要的条目复制到新地图

b。将对原始地图进行第一次传递并将所有条目复制到新地图,然后将对新地图进行第二次传递并删除所有不需要的条目

当然a比b快

如果不是迭代 keySet 并从 map 中获取相应的值,而是迭代 entrySet 并直接从 entry 中获取相应的值,会更快。

也不是代码有错误:它复制原始地图而不是从空地图开始。

最坏的情况下应该是一样的complexity/optimization。 Map的retainAll方法class也是遍历map中的元素,然后调用contain方法(可参考OpenJDK源码或this post

但是如果解决方案a.被初始化为空映射。我认为它应该比解决方案 b. 更好,因为解决方案 b.

中有更多操作