使用数组,列表,还是成千上万的字符串?

时间:2012-11-14 04:01:23

标签: java arrays string list

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

    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;
    }

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

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

4 个答案:

答案 0 :(得分:5)

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

如果你需要内存效率,取决于你以后如何使用列表,你可以使用类似trieBloom filter的内容。

答案 1 :(得分:4)

内存使用率ArrayList<String>接近裸String[]。如果您知道要存储大约50,000个字符串,那么构建具有该初始容量的ArrayList将会有所帮助;它会彻底减少重新分配。但是,我肯定不会使用LinkedList。这有更多的开销。

如果字符串本身适合内存,则存储50,000个条目没有问题。

答案 2 :(得分:2)

列表可以处理它,它只取决于是否有大量内存可用。

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

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

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

答案 3 :(得分:1)

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

所以我认为没有必要将所有细节存储在ArrayList的内存中,因为html文件的数量会不断变化。我建议你应该运行一个搜索所有这些文件的过程,并将html文件名存储在一个单独的物理文件中(比如一个txt文件)。通过这种方式,您可以通过运行作业定期更新文件列表(您可以使用unix脚本,也可以通过java执行)。

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

从txt文件读取后,您可以使用ArrayList;但不会建议在记忆中保留所有名字。