論使用HashMap優化雙層For循環的實際性能


當需要對兩個集合進行相互操作的時候,一般需要進行雙層For循環,但我們知道雙層For在數量越大的時候性能影響越大

這時候我們會想到的其中一種解決方法就是利用Hashmap在查找數據的高效上來優化雙層For

我利用下面的代碼來模擬測試兩種情況的性能:

public static void main(String[] args) {

        for (int i = 0; i < 10000; i += 10) {
            List<String> loopList1 = getLoopList(i);
            List<String> loopList2 = getLoopList(i);
            long loopBy2forTimes = doBy2ForLoop(loopList1, loopList2);
            long loopByHashMapForTimes = doByHashmapForLoop(loopList1, loopList2);
            System.out.println("size:" + i + ": " + loopBy2forTimes + "," + loopByHashMapForTimes);
        }

        for (int i = 10000; i < 100000; i += 10000) {
            List<String> loopList1 = getLoopList(i);
            List<String> loopList2 = getLoopList(i);
            long loopBy2forTimes = doBy2ForLoop(loopList1, loopList2);
            long loopByHashMapForTimes = doByHashmapForLoop(loopList1, loopList2);
            System.out.println("size:" + i + ": " + loopBy2forTimes + "," + loopByHashMapForTimes);
        }
    }

    private static List<String> getLoopList(int size) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            list.add(String.valueOf(i));
        }
        return list;
    }

    private static long doBy2ForLoop(List<String> loopList1, List<String> loopList2) {
        long startTime = System.currentTimeMillis();

        for (String str1 : loopList1) {
            for (String str2 : loopList2) {
                if (str1.equals(str2)) {
                    continue;
                }
            }
        }
        long endTime = System.currentTimeMillis();
        return endTime - startTime;
    }

    private static long doByHashmapForLoop(List<String> loopList1, List<String> loopList2) {
        long startTime = System.currentTimeMillis();
        Map<String, String> loopListMap = loopList2.stream().collect(Collectors.toMap(k -> k, Function.identity()));
        for (String str1 : loopList1) {
            String str2 = loopListMap.get(str1);
        }
        long endTime = System.currentTimeMillis();
        return endTime - startTime;
    }

 

結果: 第一個表格為1~10000, 第二個表格為10000~100000,

 

可以看到雙層For數據量越大,執行時間越長,而使用了Hashmap,縱使數據量增長到了10w,執行時間也幾乎為0(3-4ms)

嘛當然我們也可以算出上述代碼的雙層For的時間復雜度為O((1+N)/2),而使用Hashmap的時間復雜度為O(1),也可以發現List轉Map幾乎不耗時間

 但是也要注意到,在數據量低(<2000)的情況下,兩者沒有區別,而hashmap還需要占用多余的空間

 

結論:選擇哪個來遍歷還是需要看具體的場景的數據量(但是數據量不清又嫌麻煩的咱大部分情況還是會用hashmap大法了233)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM