首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 遍歷文件夾兩種實現:遞歸 vs 非遞歸性能實測

     編輯:Java 相關知識

方案 A:非遞歸(隊列 BFS)

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    LinkedList queue = new LinkedList<>();
    File root = new File("c:\\java\\");
    File[] files = root.listFiles();
    for (File f : files) {
        if (f.isDirectory()) queue.add(f);
        else System.out.println(f.getAbsolutePath());
    }
    File current;
    while (!queue.isEmpty()) {
        current = queue.removeFirst();
        File[] children = current.listFiles();
        if (children == null) continue;
        for (File f : children) {
            if (f.isDirectory()) queue.add(f);
            else System.out.println(f.getAbsolutePath());
        }
    }
    System.out.println("耗時: " + (System.currentTimeMillis() - start) + "ms");
}

方案 B:遞歸(DFS)

private static List fileList = new ArrayList<>();
public static void main(String[] args) {
    long start = System.currentTimeMillis();
    refreshFileList("c:\\java");
    System.out.println("耗時: " + (System.currentTimeMillis() - start) + "ms");
}
public static void refreshFileList(String path) {
    File dir = new File(path);
    File[] files = dir.listFiles();
    if (files == null) return;
    for (File f : files) {
        if (f.isDirectory()) {
            refreshFileList(f.getAbsolutePath());
        } else {
            System.out.println("---" + f.getAbsolutePath().toLowerCase());
            fileList.add(f);
        }
    }
}

實測結論

遞歸方案(B)性能相對更好。原因:

  • 遞歸直接利用棧幀管理遍歷狀態,無額外隊列對象創建/銷毀開銷。
  • 非遞歸需維護 LinkedList,頻繁 add/removeFirst 產生臨時對象,GC 壓力大。
  • 現代 JVM 對尾遞歸優化、棧幀分配極其高效,除非目錄極深(超過棧限制),遞歸通常更快。

工程建議

  • 常規業務:優先用遞歸,代碼簡潔、性能優。
  • 極深目錄結構(如幾萬層):改用非遞歸避免 StackOverflowError。
  • 需併發遍歷、可中斷、進度回調等複雜場景:非遞歸更靈活。
  • Java 7+ 可用 Files.walkFileTree() (NIO.2) 獲得更豐富的訪問控制與性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved