对数千个字符串使用数组、列表或其他方式



我有以下方法可以获取direcory名称:

    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 个目录名称,列表是正确的选择吗?它是否具有内存效率,是否可以处理 50000 个或更多字符串?

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

List只是一个

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

如果您需要内存效率,根据您稍后使用列表的方式,您可以使用 trie 或 Bloom 过滤器之类的东西。

ArrayList<String>

内存使用量接近裸String[]。如果您知道要存储大约 50,000 个字符串,则使用该初始容量构建ArrayList会有所帮助;这将大大减少重新分配。但是,我绝对不会使用LinkedList。这会产生更多的开销。

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

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

如果你真的知道你将有 50000 个元素,那么最好按如下方式声明列表

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

这将消除调整列表大小的开销。

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

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

当你实际需要对这些html文件执行一些操作时;从你的txt文件中读取html文件名。

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

最新更新