【性能优化】两种方案优化双层for循环语句 附代码和实例

您所在的位置:网站首页 嵌套for循环优化 【性能优化】两种方案优化双层for循环语句 附代码和实例

【性能优化】两种方案优化双层for循环语句 附代码和实例

2023-12-19 22:58| 来源: 网络整理| 查看: 265

现有如下需求,需在订单信息类中根据用户信息类的userId匹配到对应的信息并输出商品skuId。

先给出实体类:用户信息类UserInfo和订单信息类OrderInfo。用户信息类如下所示:

/** * @author Carson Chu * @date 2020/1/13 19:43 * 用户信息类 */ @Data public class UserInfo { /* 用户Id */ private String userId; /* 用户名 */ private String name; /* 用户性别 */ private String gender; public UserInfo(String userId, String name, String gender) { this.userId = userId; this.name = name; this.gender = gender; } }

订单信息类如下:

/** * @author Carson Chu * @date 2020/1/13 19:44 * 订单信息类 */ @Data public class OrderInfo { /* 用户Id */ private String userId; /* 订单号 */ private Long orderId; /* 商品sku */ private Long skuId; /* 商品价格 */ private BigDecimal price; public OrderInfo(String userId, Long orderId, Long skuId, BigDecimal price) { this.userId = userId; this.orderId = orderId; this.skuId = skuId; this.price = price; } }

假设用户信息表和订单信息表中各有十万条数据,需要匹配到商品skuId,先采用双层for循环,附上main()方法逻辑:

/** * @author Carson Chu * @date 2020/1/13 20:09 */ public class Main { public static void main(String[] args) { /* 用户信息集合 */ List userInfoList = Lists.newArrayList(); /* 订单信息集合 */ List orderInfoList = Lists.newArrayList(); /* 手动向集合中添加十万条数据 */ for (int i = 0; i for (OrderInfo orderInfo : orderInfoList) { if (userInfo.getUserId().equals(orderInfo.getUserId())) { System.out.println(orderInfo.getSkuId()); } } } long end = System.currentTimeMillis(); System.out.println("采用原始的双层for循环查询累计耗时:" + (end - start) + "毫秒"); } /** * 生成指定长度的随机数 * * @param length * @return */ public static String createNum(int length) { StringBuilder sb = new StringBuilder(); Random rand = new Random(); for (int i = 0; i hashMap.put(orderInfo.getUserId(), orderInfo.getSkuId()); } for (UserInfo userInfo : userInfoList) { System.out.println(hashMap.get(userInfo.getUserId())); } long end = System.currentTimeMillis(); System.out.println("利用HashMap查询累计耗时:" + (end - start) + "毫秒");

在这里插入图片描述 如上图所示,哈希的查询十分的快,响应时间缩小到了915毫秒,为秒级,效率比双层for循环提高了两百多倍。

方案二:JDK8的lambda表达式和stream流

此外也可以采用jdk8的lambda表达式:

long start = System.currentTimeMillis(); // 将List转为Map,这里key一定要为唯一值 Map userInfoMap = userInfoList.stream().collect(Collectors.toMap(userInfo -> userInfo.getUserId(), userInfo -> userInfo)); // 商品skuId集合 List skuIdList = Lists.newArrayList(); skuIdList = orderInfoList.stream().map(orderInfo -> { return getSkuId(userInfoMap.get(orderInfo.getUserId()), orderInfo); }).collect(Collectors.toList()); skuIdList.stream().forEach(skuId -> { System.out.println("商品skuId:" + skuId); }); long end = System.currentTimeMillis(); System.out.println("利用lambda表达式和stream流查询累计耗时:" + (end - start) + "毫秒");

附加匹配用户信息和订单信息的方法逻辑:

/** * 匹配用户信息和订单信息,成功匹配后返回用户对应的商品skuId * * @param userInfo * @param orderInfo * @return */ private static Long getSkuId(UserInfo userInfo, OrderInfo orderInfo) { if (orderInfo.getUserId().equals(userInfo.getUserId())) { return orderInfo.getSkuId(); } return null; }

在这里插入图片描述 如上图所示,耗时也是毫秒级的,和哈希效率相当,因为事实上这种stream流就是基于HashMap的。双层for循环和这两种方案相比,执行效率和用户体验上可谓是天差地别。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3