Java 对数千个字符串使用数组、列表还是其他?

Java 对数千个字符串使用数组、列表还是其他?,java,arrays,string,list,Java,Arrays,String,List,我有以下获取目录名的方法: private List<String> getListOfDirectories(String rootDirectoryPath) { List<String> listOfDirectories = new ArrayList<>(); File directory = new File(rootDirectoryPath); File[] listOfFiles =

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

    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;
    }
private List getListOfDirectories(字符串rootDirectoryPath){
List-listOfDirectories=new-ArrayList();
文件目录=新文件(rootDirectoryPath);
文件[]listOfFiles=directory.listFiles();
for(int i=0;i
我暂时将这些目录名存储在列表中(不确定存储是否是正确的术语)。如果有50000个目录名,列表是正确的选择吗?它的内存效率高吗?它能处理50000个或更多的字符串吗

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

一个
ArrayList
在内存使用中几乎是一个空的
String[]
。如果您知道将要存储大约50000个字符串,那么使用该初始容量构建
ArrayList
会有所帮助;这将大大减少再分配。但是,我绝对不会使用
链接列表。这会带来相当多的开销


如果字符串本身适合内存,那么存储50000个条目不会有问题。

List
只是一个接口,因此它实际上取决于列表实现。假设
ArrayList
,它的内存效率大致与
字符串[]
相同。对于数组列表,最坏的情况是底层数组是一个常数因子(通常为2),大于它实际存储的数据量


如果您需要内存效率,根据您以后使用列表的方式,您可以使用或之类的工具。

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

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

List<String> list = new ArrayList<String>(50000); //specify the initial capacity
List List=newarraylist(50000)//指定初始容量

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

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

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

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


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

无论您以何种方式剪切,您的程序都将存储50000个字符串。重要的是你将如何处理这些字符串。大量的随机访问?搜索列表?添加/删除元素?这些问题将帮助您选择合适的数据结构。
ArrayList
是一种特殊的动态
array
。我唯一的建议是为构造提供初始容量或调用
ensureCapacity
。这将使列表更有效地增长。基本上
ArrayList
将在没有足够空间容纳新元素的情况下将列表增加一个元素。这将结束调用
数组。复制
以将内容从旧的备份数组移动到新的备份数组,这可能会导致效率低下(更糟糕的情况是,您将有两个数组,一个包含49999个元素,另一个内存中同时包含50000个元素…@该数组的大小通常是两倍的,因此最糟糕的情况实际上是两个数组,一个包含49999个元素,另一个包含两倍的99998个元素(当然,实际数组大小将是2的幂:)我正在构建一个从本地目录获取所有html文件并解析这些html文件的应用程序。@MattBall实际上(在仔细阅读代码之后),它更像74999((49999*3)/2+1)-不用说,最好在开始之前确保有一个合适的容量;)IIRC,常数因子实际上是1.5倍。也就是说,
字符串
s本身的内存使用量几乎肯定会超过存储它们的列表。它不是常数因子…它是平均因子…它假设您一开始没有大量过度分配。我想您的意思是“消除”而不是“元素”。(虽然你可能也指“大象”:-~:-)是的,这就是我想写的,但我不知道我是如何得到元素的。)谢谢