1. 测试代码
package xyz.yq56;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.naming.InitialContext;
public class MapOpt {
public MapOpt() {
}
public MapOpt(int num1,int num2) {
init(num1,num2);
}
private static List<Person> list1;;
private static List<Face> list2;
public void init(int num1,int num2) {
list1=new ArrayList<>();
list2=new ArrayList<>();
for(int i =0;i<num1;i++) {
Person person=new Person();
person.setId(i);
person.setName("name_"+i);
list1.add(person);
}
for(int i =0;i<num2;i++) {
Person person=new Person();
person.setId(i);
person.setName("name_"+i);
Face face=new Face();
face.setId(i);
face.setPersonId((int)Math.random()*100);
list1.add(person);
list2.add(face);
}
}
class Person{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public void test1(){
long t1=System.currentTimeMillis();
for(int i=0;i<list1.size();i++) {
for(int j=0;j<list2.size();j++) {
if(list1.get(i).getId()==list2.get(j).getPersonId()) {
list2.get(j).setName(list1.get(i).getName());
}
}
}
System.out.println("双重循环耗时:"+(System.currentTimeMillis()-t1)+" ms");
}
public void test2() {
long t2=System.currentTimeMillis();
Map<Integer, String> personMap=list1.stream().collect(Collectors.toMap(Person::getId, Person::getName,(k,v)->v));
System.out.print("stream耗时:"+(System.currentTimeMillis()-t2)+" ms => ");
for(int i=0;i<list2.size();i++) {
list2.get(i).setName(personMap.get(list2.get(i).getPersonId()));
}
System.out.println("循环map耗时:"+(System.currentTimeMillis()-t2)+" ms");
}
private void test(int num1,int num2) {
MapOpt mapOpt=new MapOpt(num1,num2);
System.out.println("外层对象数量 "+num1+" ;内层对象数量: "+num2);
System.out.println("");
for(int i=0;i<2;i++) {
mapOpt.test1();
mapOpt.test2();
System.out.println();
}
}
public static void main(String[] args) {
MapOpt mapOpt=new MapOpt();
mapOpt.test(200, 20000);
System.out.println("****************************************");
mapOpt.test(20000, 200);
}
class Face{
private int id;
private String name;
private int personId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
2. 测试结果
测试结果表明,map匹配效率更高
3.3 测试结论
如果出现两个list的值匹配,尽可能将其中一个转化为map结构。