Java 向列表中添加元素太慢

Java 向列表中添加元素太慢,java,loops,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.

我有一个循环:

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());
        }
其中citiesNames是一个包含16584个元素的字符串列表,findByCity是一个方法,在该方法中,我传递一个字符串,它在数据库中搜索相应的条目。
我要做的是搜索每个城市的对应条目,检查条目数,并将条目数添加到整数列表中。但是这个循环太慢了,需要很长时间才能显示结果。如何对此进行优化?

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

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

请注意,以及它如何使用共享ForkJoinPool。

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

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

我不清楚为什么你要把所有的城市都打包在一个列表中,而你可以在citiesRepository中创建一个函数,返回一个int,其中包含特定城市的条目数。这将大大提高性能。因此,假设您可以访问citiesRepository,程序将能够只返回一个简单的int而不是整个类的实例化


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

是citiesNames的返回类型。获取字符串吗?您可能最终优化了citiesRepository.findByCity。您正在循环中声明列表。这似乎一点也不正确。我想是您的数据库搜索减慢了速度,而不是添加到ArrayList。此外,根据前面所说的,提前设置分配列表容量可能是有意义的。在大型列表上,如果发生调整大小的情况,可能会导致性能显著下降。阅读什么是容量以及ArrayList是如何工作的。除了@AnisRs comment-尝试批量获取所有城市名称,如果数量可能很大,则使用分页。100对于许多用户来说足够重要。这仍然会从数据库中获取每个城市。流有利于可读性,而不是性能。同意。批处理操作是首选,但并不总是可行的,即您无法控制DAO或远程API来提供批处理操作。并行流是for循环之上的一个步骤。