使用Map优化双层for嵌套

在这里插入图片描述

📫 作者简介:「子非我鱼」,专注于研究全栈
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

引言

双层for使用场景:
一般我们用于合并两个或者多个对象。因为我们实际需要的数据,被两个或者多个对象所持有,那么我们有时就需要根据共同特征来合并成一个对象。
为什么要使用Map替换双层for:
通常情况下,我们对于数据量比较多的时候,如果使用的双层for,会大大降低程序运行效率,对于数据量相对较少,使用双层for嵌套,是察觉不到什么效果的。下面我为大家模拟一万条数据的情况下,合并成一个集合的效率时间

步骤一:准备数据,User.java
package com.myqxin.jh.pojo;

/**
 * @author myqxin
 * @version 1.0
 * @Desc
 * @date 2020/11/5
 */
public class User {
    private String uid;
    private String name;
    private String sex;


    @Override
    public String toString() {
        return "User{" +
                "uid='" + uid + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public User(String uid, String name) {
        this.uid = uid;
        this.name = name;
    }

    public User() {
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

步骤二:创建Person.java
package com.myqxin.jh.pojo;

/**
 * @author myqxin
 * @version 1.0
 * @Desc
 * @date 2020/11/5
 */
public class Person {
    private String pid;
    private String sex;

    public Person(String pid, String sex) {
        this.pid = pid;
        this.sex = sex;
    }

    public Person() {
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "pid='" + pid + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

步骤三:编写java代码,模拟一万条数据
 		// 模拟一万条数User数据作为测试
        ArrayList<User> ulist = new ArrayList<>();
        for (int i = 1; i <= 10000; i++) {
            ulist.add(new User(i+"","冷言"+i));
        }
        // 模拟一万条Person数据作为测试
        ArrayList<Person> plist = new ArrayList<>();
        for (int i = 1; i < 10000; i++) {
            plist.add(new Person(i+"","男"+i));
        }
步骤四:编写java代码,使用双层for合并,展示运行时间
		// 获取当前系统时间,单位毫秒值
		long start = System.currentTimeMillis();
		// 遍历集合
        for (User u : ulist) {
            for (Person p : plist) {
            	// 如果user对象的id等于person对象的id
                if (u.getUid().equals(p.getPid())){
                	// 需要的数据
                    u.setSex(p.getSex());
                }
            }
        }
        // 展示当前系统时间,单位毫秒值
        System.out.println(System.currentTimeMillis()-start);	// 879
步骤五:使用Map合并,展示运行时间

以下为固定格式,主要是把plist集合的数据封装到Map中:
Map<String,集合内对象> list2Map = 集合名.stream().collect(Collectors.toMap(集合内对象::共同特征, Function.identity()));
实例:以下执行效果是,我想把plist里面我需要的数据,合并到ulist中,他们有个共同特征pid和uid

 // 为固定格式,plist需要的数据;Person数据对象;getPid为String类型共同特征
 Map<String,Person> list2Map = plist.stream().collect(Collectors.toMap(Person::getPid, Function.identity()));
 		// 生成当前系统时间,单位毫秒值
        long start = System.currentTimeMillis();
        // 遍历集合
        for (User user : ulist) {
        	// 通过user的uid,获取map集合的对象
            Person person = list2Map.get(user.getUid());
            // 如果获取到
            if(person != null){
            	// 执行业务代码   我这里是把person里面的sex放置到user的sex中
                user.setSex(person.getSex());
            }
        }
        // 打印当前系统时间,单位毫秒值
        System.out.println(System.currentTimeMillis()-start);	// 2
结论

从上面来看,我们不难看出,双层for使用的时间,是Map的好多倍。对于数据量少的,这里我就不展示了,自己自行选择。如果是数据量比较大的,使用Map代替双层for

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非我鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值