双重for循环优化

这篇具有很好参考价值的文章主要介绍了双重for循环优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目中有段代码逻辑是个双重for循环,发现数据量大的时候,直接导致数据接口响应超时,这里记录下不断优化的过程,算是抛砖引玉吧~
Talk is cheap,show me your code!

1、数据准备

Order

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {
    private Integer orderId;
    private String orderName;
}

OrderDetail

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class OrderDetail {

    private Integer orderDetailId;

    private Integer orderId;

    private String orderNums;

    private String orderAddress;
}

造测试数据

public static List<Order> getOrderTestList() {
		List<Order> orders = new ArrayList<>();
		for (int i = 1; i <= 50000; i++) {
			Order order = new Order();
			order.setOrderName(UUID.randomUUID().toString());
			order.setOrderId(i);
			orders.add(order);
		}
		return orders;
	}

	public static List<OrderDetail> getOrderDetailTestList() {
		List<OrderDetail> orderDetails = new ArrayList<>();
		for (int i = 30000; i >= 1; i--) {
			OrderDetail orderDetail = new OrderDetail();
			orderDetail.setOrderAddress(UUID.randomUUID().toString());
			orderDetail.setOrderId(i);
			orderDetail.setOrderDetailId(i);
			orderDetails.add(orderDetail);
		}
		return orderDetails;
	}

2、原始双重for循环

@Test
	void test3() {
		List<Order> orderTestList = getOrderTestList();
		List<OrderDetail> orderDetailTestList = getOrderDetailTestList();

		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		
		// 直接使用双重for循环查询条件
		for (Order order : orderTestList) {
			int orderId = order.getOrderId();
			for (OrderDetail orderDetail : orderDetailTestList) {
				if(orderId == orderDetail.getOrderId() ){
					System.out.println("模拟数据orderAddress 业务处理......" + orderDetail.getOrderAddress());
				}
			}
		}
        
		stopWatch.stop();
		System.out.println("最终耗时" + stopWatch.getTotalTimeMillis());
	}

执行结果
双重for循环优化,算法,Java,java

3、直接使用双重for循环查询条件,增加break条件

	@Test
	void test3() {
		List<Order> orderTestList = getOrderTestList();
		List<OrderDetail> orderDetailTestList = getOrderDetailTestList();

		StopWatch stopWatch = new StopWatch();
		stopWatch.start();

		// 直接使用双重for循环查询条件,增加break条件
		for (Order order : orderTestList) {
			int orderId = order.getOrderId();
			for (OrderDetail orderDetail : orderDetailTestList) {
				if(orderId == orderDetail.getOrderId() ){
					System.out.println("模拟数据orderAddress 业务处理......" + orderDetail.getOrderAddress());
					break;
				}
			}
		}

		stopWatch.stop();
		System.out.println("最终耗时" + stopWatch.getTotalTimeMillis());
	}

执行结果
双重for循环优化,算法,Java,java

4、使用迭代器来删除内层循环中已使用或判断过的元素,减少循环次数

	@Test
	void test3() {
		List<Order> orderTestList = getOrderTestList();
		List<OrderDetail> orderDetailTestList = getOrderDetailTestList();

		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		
		// 使用迭代器来删除内层循环中已使用或判断过的元素,减少循环次数
		for (Order order : orderTestList) {
			ListIterator<OrderDetail> orderDetailListIterator = orderDetailTestList.listIterator();
			int orderId = order.getOrderId();

			while (orderDetailListIterator.hasNext()) {
				OrderDetail nextOrderDetail = orderDetailListIterator.next();
				if(orderId == nextOrderDetail.getOrderId() ){
					System.out.println("模拟数据orderAddress 业务处理......" + nextOrderDetail.getOrderAddress());
					orderDetailListIterator.remove();
				}
			}
		}

		stopWatch.stop();
		System.out.println("最终耗时" + stopWatch.getTotalTimeMillis());
	}

执行结果
双重for循环优化,算法,Java,java

5、把要筛选的信息写成map集合,遍历List时用map.get(key)来实现检索

	@Test
	void test3() {
		List<Order> orderTestList = getOrderTestList();
		List<OrderDetail> orderDetailTestList = getOrderDetailTestList();

		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		
		//使用stream() 记得一定要判空
		Map<Integer, String> orderAddressMap =
				orderDetailTestList.stream().collect(Collectors.toMap(OrderDetail::getOrderId, OrderDetail::getOrderAddress));
		for (Order order : orderTestList) {
			int orderId = order.getOrderId();
			String orderAddress = orderAddressMap.get(orderId);
			if (StringUtils.hasLength(orderAddress)) {
				System.out.println("模拟数据orderAddress 业务处理......" + orderAddress);
			}
		}

		if (StringUtils.hasLength(orderAddress)) {
				System.out.println("模拟数据orderAddress 业务处理......" + orderAddress);
	    }
		
		stopWatch.stop();
		System.out.println("最终耗时" + stopWatch.getTotalTimeMillis());
	}

测试结果
双重for循环优化,算法,Java,java

6、总结

可以看出,通过迭代删除或者利用map集合特性均能够有效提升查询效率。文章来源地址https://www.toymoban.com/news/detail-616135.html

到了这里,关于双重for循环优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的for循环

        for循环是Java程序中设计使用最多的循环语句之一。一个for循环可以用来重复执行某个语句直到条件得到满足。 在Java中,for是一种,是一种循环结构的引导词 代码如下: 在这个例子中,x是循环的变量,它被初始化为0,每次循环x加1直到x10,而x加1也可以写成x++;这

    2024年02月12日
    浏览(34)
  • java 增强for循环

    学的不是技术,更是梦想!!!

    2024年02月14日
    浏览(34)
  • Java循环方式对比:增强型for循环、传统for循环和Lambda表达式for循环

    在Java编程中,循环是一种重要的控制结构,用于迭代遍历集合或数组。Java提供了多种循环方式,其中包括增强型for循环、传统for循环和Lambda表达式for循环。本篇博客将对这三种循环方式进行对比,探讨它们的语法、特性和适用场景,帮助读者在不同情况下选择最合适的循环

    2024年02月05日
    浏览(45)
  • 【Java编程教程】详解 Java for 循环语句

    Java for 循环用于多次迭代程序的一部分。如果迭代次数固定,建议使用for循环。 Java 中有三种类型的 for 循环。   简单的 for 循环 For-each或增强型 for 循环 标记为循环 一个简单的 for 循环与C / C++相同。我们可以初始化变量,检查条件和递增/递减值。它由四个部分组成: 初始

    2024年02月08日
    浏览(49)
  • 基于des双重加密算法的安全web电子邮件系统的设计与实现(论文+源码)_java_285

    摘要 本文首先研究并介绍国内外目前的背景和现状,在此基础上给出论文的主要研究内容,其次,对双重加密算法的电子邮件系统的需求进行了分析。再次,对双重加密算法的电子邮件系统进行了总体设计,根据其总体设计、软件架构和总体功能模块进行了详细设计,作出了

    2024年02月04日
    浏览(55)
  • 【Java 基础】for 循环、嵌套循环详解(附案例)

    《 Java 零基础入门到精通 》 专栏持续更新中。通过本专栏你将学习到 Java 从 入门 到 进阶 再到 实战 的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java

    2023年04月08日
    浏览(40)
  • java for循环内部使用线程

    2024年02月06日
    浏览(36)
  • JAVA多线程处理for循环数据

    对for循环内数据启用多线程执行,主线程与子线程无先后顺序 执行结果: 对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行 执行结果: 对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行 执行结果: 4. JAVA多线程10个线程处理100

    2024年02月11日
    浏览(54)
  • 【java】几种跳出 for循环的方法

    在Java中,有多种方法可以跳出 for 循环,从而停止循环的执行。以下是其中的三种常见的方法: 当 i 等于5时, break 语句会将控制流程跳出 for 循环从而停止后续代码的执行。 当 i 等于5时, return 语句会立即退出整个方法从而停止对 for 循环的执行。 当 i 等于5时, continue 语

    2024年02月07日
    浏览(36)
  • 【笔记】Java中for循环遍历删除操作

    在Java中,有些场景需要遍历集合中的元素,然后根据条件进行删除元素的操作。如果使用传统的for循环遍历方式来删除元素,很可能出错或发生意想不到的问题。推荐使用 迭代器iterator 完成 1. 推荐使用 迭代器方式****删除 阿里规约:【强制】不要在 foreach 循环里进行元素的

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包