性能提高:循环中使用map匹配,而不是使用内层循环

本文通过具体示例对比了使用List与Map进行数据匹配的效率。实验结果显示,在大规模数据匹配场景下,采用Map结构能显著提高匹配速度,减少耗时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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结构。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值