我有以下获取目标名称的方法:
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文件。
答案 0 :(得分:5)
List
只是一个接口,所以它实际上取决于列表实现。假设ArrayList<String>
,它将与String[]
大致相同,具有内存效率。数组列表的最差情况是底层数组是一个常数因子(通常为2),大于它实际存储的数据量。
如果你需要内存效率,取决于你以后如何使用列表,你可以使用类似trie或Bloom 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;但不会建议在记忆中保留所有名字。