性能/可读性:嵌套for循环与HashMap

时间:2017-09-17 21:12:06

标签: java performance list dictionary time-complexity

(注意:对不起,如果我把这个问题放在错误的堆栈交换上,如果这个问题应该转到其他地方,我会重新发布它...)

我刚刚开始在一家科技公司实习,并想询问代码性能和/或编码实践。我会查看一位资深开发人员编写的代码,这些代码在性能方面对我来说似乎并不合适,但我不确定是否因为我没有经验或者如果它是他的东西。

以下是我正在查看的代码:

// 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 / bLists足够大或经常使用的话。

非常感谢任何见解或想法,谢谢!

1 个答案:

答案 0 :(得分:3)

正如您所暗示的,尺寸是一个因素。构建散列映射意味着分配额外的内存,这可能会超过少量比较所节省的时间。

我建议你习惯做时间测试,把你的理论变成可证明的结果。无论如何,您需要这样做以在同行评审期间证明此类更改的合理性。

除此之外,我只想指出你所提议的是一个半措施。如果代码非常关键,那么首先将它构建为Map是有意义的。