当前位置: 首页 > 知识库问答 >
问题:

在此场景中使用Java收集

公良英资
2023-03-14

我正在编写一个应用程序,它可以从web服务下载文件。

文件的下载方式描述如下:

  1. 从web服务下载文件列表。如果文件数量太大,下载第一组文件,每组中的最大数量未知。下载的文件保存在系统临时目录中。
  2. 为每个文件构造一个FileDescriptor(自定义)类,其中包含系统临时文件夹中的文件filename和临时文件名以及一些其他属性。b文件描述符保存在列表中。
  3. 在此处执行一些业务逻辑。
  4. 下载下一组文件(如果有)。

我用来保存FileDescriptor列表的集合是LinkedList。但是,对于每组文件,我准备创建一个全新的LinkedList来保存它们的文件描述符。Psudocode类似于:

do {
   List<FileDescriptor> list = new LinkedList<FileDescriptor>();
   GroupOfFiles group = webService.getGroupOfFiles();
   Iterator<File> itr = group.iterator();
   while(itr.hasNext) {
       list.add(new(FileDescriptor(itr.next()));
   }

   <My Business Logic here>

} while(group.hasMoreGroups());

可以看出,每次检索到一组新文件时,我都要创建一个新的LinkedList。处理完该组文件后,就不再需要LinkedList了。我无法创建一个列表并重用它,因为每个组可以包含的最大数量是未知的。

如果我使用这样的代码,并且有数百万个文件,每个组最多只能有1000个文件(例如),它将以大量LinkedList(及其元素)作为垃圾结束。这是好事吗?我相信在这种情况下会有更好的方法来处理。

请给出你的意见。

多谢。

共有1个答案

空慈
2023-03-14

创建1000个LinkedList对象(并对其进行垃圾收集)的成本与下载数百万个文件相比微不足道。我们说的是1毫秒和小时。一些米与从地球到月球的距离。

您正在进行预优化,而在进行预优化时通常是这样的,您在错误的地方进行了此操作。

也就是说,列表是一个动态大小的数据结构,您不需要知道它的最大大小就可以重用它。它将动态增长:

List<FileDescriptor> list = new LinkedList<FileDescriptor>();
do {
    list.clear(); // remove everything from the list
    ...
}
while (...);
 类似资料:
  • WebAssembly 的整体目标 定义了 WebAssembly 适合做什么。哪些是在 Web 平台可以实现的,哪些是非 Web 平台可以实现的。下面给出了一个不完善的无序列表,包括应用/领域/计算等方向,它们可能将从 WebAssembly 中受益的, WebAssamlby 的设计过程中也会将它们做为用例。 在浏览器中 更好的让一些语言和工具可以编译到 Web 平台运行。 图片/视频编辑。

  • 4.1 使用场景 Camel管理端内部定义了很多模型对象。接口接受的数据均是模型对象对应的json。 Camel管理端,提供了界面和接口两种方式。这两种方式均可对Server、Upstream等配置信息进行更改,以及发布配置文件。那么什么场景下应该使用接口呢? 通过界面对配置文件进行更改,是一种可视化操作,非常的直观。界面方式适用于编辑配置信息,如增加location等操作。 如果通过界面进行配置

  • 学件 “学件”(Learnware)一词由南京大学周志华老师原创,学件(Learnware) = 模型(model) + 规约(specification),具有可重用、可演进、可了解的特性。 很多人可能在自己的应用中已经建立了类似的模型,他们也很愿意找到一个地方把这些模型分享出去。这样一来,一个新用户想要应用,也许不用自己去建立一个,而是先到“学件”市场上找一找有没有合适的,拿来直接或修改后使用

  • 慕课堂的功能针对老师的实质性需求,积极利用信息化技术手段将线上与线下教学进行结合,可主要分为以下三个场景来使用。 1.1. 线下教学+线上互动 应用场景: 适用于秋季学期正常开学,进行线下授课的高校 解决方案: 线下教学+线上慕课堂教学互动 方案特点: 教师依然根据原有的方式(线下)正常上课,利用慕课堂开展签到、测验、讨论等教学活动。无论是线上还是线下都最大范围保护了教师的教学习惯,简单容易上手,

  • 问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。

  • 问题内容: 我可以得到一个完整的简单方案,即建议如何使用它的教程,特别是在队列中吗? 问题答案: 和方法被设计为提供一种机制,以允许一个线程块,直到一个特定的条件被满足。为此,我假设你要编写一个阻塞队列实现,其中具有一些固定大小的元素后备存储。 你要做的第一件事是确定你希望方法等待的条件。在这种情况下,你将希望该方法阻塞直到存储空间可用,并且你将希望该方法阻塞直到返回某些元素。 关于必须使用等待和