[英]Performance / readibility: Nested for-loops vs HashMap
(注意:很抱歉,如果我把这个问题放在错误的堆栈交换上,如果这个问题应该放在其他地方,我会重新发布它。)
我刚开始在一家科技公司实习,想问一下代码性能和/或编码实践。 我正在查看由一位高级开发人员编写的代码,该代码在性能方面对我来说似乎不正确,但是我不确定这是因为我没有经验还是归因于他。
这是我正在查看的代码:
// Given the following:
List<TypeA> aList = (...)
List<TypeB> bList = (...)
for(TypeA obj : aList) {
boolean found = false;
for(TypeB obj2 : bList) {
if(obj.name.equals(obj2.name) {
found = true;
break;
}
}
if(!found) {
obj.doSomething();
someOtherList.add(obj);
}
}
我的想法是,对于代码尝试执行的操作,O(n ^ 2)嵌套的for循环效率很低。 做这样的事会更好吗? (也请不要介意任何语法错误,我正在即时输入它;)):
// Given the following:
List<TypeA> aList = (...)
List<TypeB> bList = (...)
Map<TypeB, String> bListToName = new HashMap<>()
bList.forEach(obj -> bListToName.put(obj, obj.name));
for(TypeA obj : aList) {
if(bListToName.get(obj.name) == null) {
obj.doSomething();
someOtherList.add(obj);
}
}
我的理由是,我使用了两个O(n)循环,而不是嵌套的for循环,这将以相当大的幅度提高性能,尤其是在我们的a / bList足够大或经常使用的情况下。
任何见解或想法将不胜感激,谢谢!
如您所暗示,大小是一个因素。 构建哈希图意味着分配额外的内存,这可能会超过少量比较所节省的时间。
我建议您习惯进行时间测试以使您的理论得到可证明的结果。 无论如何,您都需要这样做以证明在同行评审期间进行此类更改是合理的。
除此之外,我只想指出您的建议是一个半措施。 如果代码确实很关键,那么首先将其构造为Map就是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.