簡體   English   中英

性能/可讀性:嵌套for循環與HashMap

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM