2

我有以下获取目录名称的方法:

    private List<String> getListOfDirectories(String rootDirectoryPath) {

        List<String> listOfDirectories = new ArrayList<>();

        File directory = new File(rootDirectoryPath);
        File[] listOfFiles = directory.listFiles();

        for (int i = 0; i < listOfFiles.length; i++) {

            if (listOfFiles[i].isDirectory()) {
                listOfDirectories.add(listOfFiles[i].getName());
            }
        }

        return listOfDirectories;
    }

我暂时将这些目录名称存储在列表中(不确定存储是否是正确的术语)。如果有 50000 个目录名,List 是正确的选择吗?它的内存效率高吗?它可以处理 50000 个或更多的字符串吗?

编辑:我正在开发一个在本地目录中搜索 html 文件并解析这些 html 文件的应用程序。

4

4 回答 4

5

List只是一个接口,所以它真的取决于列表实现。假设ArrayList<String>,它将大致与String[]. 数组列表的最坏情况是底层数组是一个常数因子(通常为 2),大于它实际存储的数据量。

如果您需要内存效率,这取决于您稍后使用列表的方式,您可以使用trieBloom filter之类的东西。

于 2012-11-14T04:04:18.533 回答
4

An的内存使用量ArrayList<String>几乎String[]为零。如果您知道要存储大约 50,000 个字符串,那么ArrayList使用该初始容量构建 将有助于;它将大大减少重新分配。但是,我绝对不会使用 a LinkedList。这有相当多的开销。

只要字符串本身适合内存,存储 50,000 个条目就没有问题。

于 2012-11-14T04:04:15.727 回答
2

列表可以处理它,它只取决于是否有那么多可用的内存。

如果您真的知道您将拥有 50000 个元素,那么最好将列表声明如下

List<String> list = new ArrayList<String>(50000); //specify the initial capacity

这将消除列表调整开销。

于 2012-11-14T04:05:01.363 回答
1

正如你所指出的;您正在寻找在本地目录中搜索 html 文件的有效方法。

所以我认为将所有细节存储在 ArrayList 的内存中是没有意义的,因为 html 文件的数量会不断变化。我建议你应该运行一个搜索所有这些文件的进程,并将 html 文件名存储在一个单独的物理文件中(比如一个 txt 文件)。这样,您可以通过运行作业定期更新您的文件列表(您可以拥有一个 unix 脚本,甚至可以通过 java 来完成)。

而当你真正需要对那些 html 文件执行一些操作时;从 txt 文件中读取 html 文件名。

从 txt 文件读取后,您可以使用 ArrayList;但不建议将所有名称都保存在内存中。

于 2012-11-14T05:05:43.433 回答