将元素添加到列表太慢

时间:2019-03-06 20:58:01

标签: java loops

我有这个循环:

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 个答案:

答案 0 :(得分:1)

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

此外,可以预先设置分配列表容量。在大型列表上,调整大小可能会导致性能显着下降(有关ArrayList如何工作的更多信息here

答案 1 :(得分:0)

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

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

请注意pitfalls of the parallel stream及其使用共享ForkJoinPool的方式。

答案 2 :(得分:0)

要优化此循环,您将必须修改find​​ByCity,以便它可以一次处理所有循环。 如果您无法修改find​​ByCity,则可以始终对Streams使用并行性:

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