【发布时间】:2012-11-02 14:16:50
【问题描述】:
我有以下获取目录名称的方法:
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 个目录名,List 是正确的选择吗?它的内存效率高吗?它可以处理 50000 或更多的字符串吗?
编辑:我正在开发一个在本地目录中搜索 html 文件并解析这些 html 文件的应用程序。
【问题讨论】:
-
无论你怎么剪,你的程序都将存储 50,000 个字符串。重要的是您将如何处理这些字符串。大量随机访问?搜索列表?添加/删除元素?这些问题将帮助您选择正确的数据结构。
-
一个
ArrayList是特殊动态array。我唯一可能建议的是您为构造提供初始容量或调用ensureCapacity。这将使列表更有效地增长。基本上。ArrayList将在没有足够空间容纳新元素的情况下将列表增加一个元素。这结束了调用Arrays.copy将内容从旧的支持数组移动到新的数组,这可能会变得低效(更糟糕的情况,你将有两个数组,一个有 49、999 个元素,一个有 50、000 个元素在内存中一下子…… -
@MadProgrammer 数组的大小通常是 加倍,所以最坏的情况实际上是 2 个数组,一个有 49,999 个元素,一个有两倍, 99998(当然,实际数组大小将是 2 的幂 :)
-
我正在构建一个从本地目录获取所有 html 文件并解析这些 html 文件的应用程序。
-
@MattBall 实际上(在阅读了更多代码之后),它更像是 74999 ((49999 * 3) / 2 + 1) - 不用说,更好地确保之前的容量你开始;)