使用Map优化双层for循环
1.双层for循环使用场景
一般我们用于合并两个或者多个对象。因为我们实际需要的数据,被两个或者多个对象所持有,那么我们有时就需要根据共同特征来合并成一个对象。
2.为什么要使用Map替换双层for:
通常情况下,我们对于数据量比较多的时候,如果使用的双层for,会大大降低程序运行效率,对于数据量相对较少,使用双层for嵌套,是察觉不到什么效果的。下面我为大家模拟一万条数据的情况下,合并成一个集合的效率时间
3.准备数据
3.1 User.java
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;
}
}
3.2 Person.java
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 + '\'' +
'}';
}
}
4.测试案例
4.1模拟数据
public class ForUpdate {
public static void main(String[] args) {
// 模拟一万条数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));
}
}
}
4.2使用双层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);
4.3,使用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);
从上面来看,我们不难看出,双层for使用的时间,是Map的好多倍。对于数据量少的,这里我就不展示了,自己自行选择。如果是数据量比较大的,使用Map代替双层for