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本身的内存使用量几乎肯定会超过存储它们的列表。它不是常数因子…它是平均因子…它假设您一开始没有大量过度分配。我想您的意思是“消除”而不是“元素”。(虽然你可能也指“大象”:-~:-)是的,这就是我想写的,但我不知道我是如何得到元素的。)谢谢