为了账号安全,请及时绑定邮箱和手机立即绑定

将元素添加到 List 太慢

将元素添加到 List 太慢

慕桂英4014372 2022-07-20 20:37:31
我有这个循环:List<Integer> numbers = new ArrayList<Integer>(); for(int x=0; x<citiesNames.size();x++){            List<Cities> numeroCiudades = citiesRepository.findByCity(citiesNames.get(x));            numbers.add(numeroCiudades.size());            //System.out.println(numeroCiudades.size());        }其中 cityNames 是包含 16584 个元素的字符串列表,而 findByCity 是我传递字符串并在数据库中搜索相应条目的方法。我要做的是搜索每个城市的相应条目,检查条目数,并将条目数添加到整数列表中。但是这个循环太慢了,需要很长时间才能显示结果。我该如何优化呢?
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我不清楚为什么必须在 List 中“打包”所有城市,因为您可以在itiesRepository 中创建一个函数,该函数返回一个包含特定城市条目数的 int。(这会大大提高性能。因此,程序将能够只返回一个简单的 int 而不是整个类的实例化)(假设您可以访问 cityRepository)。

此外,提前设置分配列表容量可能是有意义的。在大型列表中调整大小会导致性能显着下降(在此处阅读有关 ArrayList 工作原理的更多信息)


查看完整回答
反对 回复 2022-07-20
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

要优化此循环,您必须修改 findByCity 以便它可以一次处理所有这些。如果您无法修改 findByCity,您始终可以使用 Streams 的并行性:

    int numbers[] = citiesNames.parallelStream()
            .mapToInt(c -> citiesRepository.findByCity(c).size())
            .toArray();


查看完整回答
反对 回复 2022-07-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

您可以使用并行流,假设citiesName是普通的 Java 集合类型:

citiesName.parallelStream()
          .map(citiesRepository::findByCity)
          .collect(Collectors.toList())

请注意并行流的缺陷以及它如何使用共享的ForkJoinPool.


查看完整回答
反对 回复 2022-07-20
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信