我有以下方法可以获取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;但不建议将所有名称保存在内存中。