我需要从函数返回HashMap的子集。那么什么是更好的方法或最有效的方法:
一个。迭代HashMap键,以我的条件为准,将它们添加到本地创建的HashMap并返回它
或
湾克隆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;
}
还是既优化又高效?
答案 0 :(得分:4)
一个。将在原始地图上执行一次传递,并仅将您想要的条目复制到新地图
湾将在原始地图上进行第一次传递并将所有条目复制到新地图,然后在新地图上进行第二次传递并删除所有不需要的条目
当然,a比b更快。
如果不是在keySet上迭代并从map中获取相应的值,而是在entrySet上迭代,并直接从条目中获取相应的值,那就更快了。
也不是代码有错误:它复制原始地图而不是从空地图开始。
答案 1 :(得分:1)
在最坏的情况下应该是相同的复杂性/优化。 Map类的retainAll
方法也迭代地图中的元素,然后调用contain
方法(可以引用OpenJDK源或this post)
但是如果解决方案 a。被初始化为空地图。我认为它应该比解决方案 b。更好,因为解决方案 b中有更多操作。