将元素添加到 List 太慢

我有这个循环:


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 是我传递字符串并在数据库中搜索相应条目的方法。我要做的是搜索每个城市的相应条目,检查条目数,并将条目数添加到整数列表中。但是这个循环太慢了,需要很长时间才能显示结果。我该如何优化呢?


慕桂英4014372
浏览 155回答 3
3回答

郎朗坤

我不清楚为什么必须在 List 中“打包”所有城市,因为您可以在itiesRepository 中创建一个函数,该函数返回一个包含特定城市条目数的 int。(这会大大提高性能。因此,程序将能够只返回一个简单的 int 而不是整个类的实例化)(假设您可以访问 cityRepository)。此外,提前设置分配列表容量可能是有意义的。在大型列表中调整大小会导致性能显着下降(在此处阅读有关 ArrayList 工作原理的更多信息)

一只甜甜圈

要优化此循环,您必须修改 findByCity 以便它可以一次处理所有这些。如果您无法修改 findByCity,您始终可以使用 Streams 的并行性:&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;numbers[]&nbsp;=&nbsp;citiesNames.parallelStream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToInt(c&nbsp;->&nbsp;citiesRepository.findByCity(c).size()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toArray();

倚天杖

您可以使用并行流,假设citiesName是普通的 Java 集合类型:citiesName.parallelStream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(citiesRepository::findByCity) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList())请注意并行流的缺陷以及它如何使用共享的ForkJoinPool.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java