Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 性能/可读性:嵌套for循环与HashMap_Java_Performance_List_Dictionary_Time Complexity - Fatal编程技术网

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

Java 性能/可读性:嵌套for循环与HashMap,java,performance,list,dictionary,time-complexity,Java,Performance,List,Dictionary,Time Complexity,(注意:如果我把这个问题放在错误的堆栈交换上,很抱歉,如果这个问题应该放在其他地方,我会重新发布它…) 我刚刚开始在一家科技公司的第一次实习,想了解代码性能和/或编码实践。我正在浏览一个高级开发人员编写的代码,在性能方面我觉得不太合适,但我不确定这是因为我没有经验,还是因为他的原因 下面是我正在查看的代码: // Given the following: List<TypeA> aList = (...) List<TypeB> bList = (...) for(Ty

(注意:如果我把这个问题放在错误的堆栈交换上,很抱歉,如果这个问题应该放在其他地方,我会重新发布它…)

我刚刚开始在一家科技公司的第一次实习,想了解代码性能和/或编码实践。我正在浏览一个高级开发人员编写的代码,在性能方面我觉得不太合适,但我不确定这是因为我没有经验,还是因为他的原因

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

// 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);
    }
}
//给定以下条件:
列表列表列表=(…)
列表bList=(…)
用于(A型对象:列表){
布尔值=false;
用于(类型B obj2:bList){
if(obj.name.equals)(obj2.name){
发现=真;
打破
}
}
如果(!找到){
对象。doSomething();
添加(obj);
}
}
我的想法是,O(n^2)嵌套for循环对于代码尝试执行的操作来说效率很低。这样做会更好吗?(另外,请不要介意任何语法错误,我正在动态地键入它;):

//给定以下条件:
列表列表列表=(…)
列表bList=(…)
Map bListToName=newhashmap()
bList.forEach(obj->bListToName.put(obj,obj.name));
用于(A型对象:列表){
if(bListToName.get(obj.name)==null){
对象。doSomething();
添加(obj);
}
}
我的理由是,我使用两个O(n)循环来代替嵌套的for循环,这应该会提高性能,特别是如果我们的a/BLIST足够大或使用频率足够高的话


如有任何见解或想法,将不胜感激,谢谢

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

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


除此之外,我想指出的是,你提出的是一个半措施。如果代码真的很关键,那么首先将其构造为一个映射是有意义的。

正如您所暗示的,大小是一个因素。构建hashmap意味着分配额外的内存,这可能会超过在少量比较中节省的时间

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

除此之外,我想指出的是,你提出的是一个半措施。如果代码真的很关键,那么首先将其构造为一个映射是有意义的

// 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);
    }
}