前些時間項目遇到一個有意思的問題,讓我對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);
}
這樣效率大大提高了。。。