前些时间项目遇到一个有意思的问题,让我对map有了一个新的认知,先介绍背景吧:
package com.chen.test;
public class Employee {
private Integer num;
private String name;
public Employee(Integer num, String name) {
this.num = num;
this.name = name;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
}
@Test
public void test01(){
List<Employee> e1List = new ArrayList<>();
List<Employee> e2List = new ArrayList<>();
Employee e1 = new Employee(1,"zhangsan1");
Employee e2 = new Employee(2,"zhangsan2");
Employee e3 = new Employee(3,"zhangsan3");
Employee e4 = new Employee(4,"zhangsan4");
e1List.add(e1);
e1List.add(e2);
e1List.add(e3);
e2List.add(e1);
e2List.add(e2);
e2List.add(e3);
e2List.add(e4);
}
先建立一个基本类,然后创建四个对象,两个集合,将这四个对象存到这两个集合中,可见这两个集合中存的不一致,那问题是找出这两个集合中具有相同对象的员工号并输出。
一般思路是:将这两个集合进行嵌套遍历,内部再用一个if判断,如下:
for(Employee em1 : e1List){
for(Employee em2 : e2List){
if(em2.getNum().equals(em1.getNum())){
System.out.println(em2);
}
}
}
这样并没有什么错,但问题是如果这个集合中的元素足够多的话,那么遍历就很耗费时间的。
另外一种思路,就是利用map了,将其中一个集合中的对象的员工号由于不重复作为key,相应的对象作为value存到map中,然后遍历另外一个集合,通过get()方法得到结果:
Map<Integer,Employee> eMap = new HashMap<>();
for(Employee ee1 : e1List){
eMap.put(ee1.getNum(),ee1);
}
for(Employee ee2 : e2List){
Employee employee = eMap.get(ee2.getNum());
System.out.println(employee);
}
这样效率大大提高了。。。