java两个大量数据的集合取交集、并集

本文介绍了如何通过优化反序列化方法和实现equals()及hashCode()来提升数据同步效率。从原本的5分钟缩短到0.5秒,关键在于使用了类型引用和集合操作。同时提供了获取ArrayList交并集的高效实现,利用LinkedList和HashSet特性减少计算时间。
摘要由CSDN通过智能技术生成

工作上需要调第三方接口同步数据过来,一开始jsonString jsonObject转来转去一个同步接口得耗时5分钟,现在只需要0.5秒

1、反序列化相关json数据

//小括号里面的clazz非常重要
private static <T> Result<T> parseResult(String json, Class<T> clazz) {
    return JSONObject.parseObject(json, new TypeReference<Result<T>>(clazz) {
    });
}

2、增加相关实体的equals() 和hashcode()方法作为判断交并集的依据

	@Override
	public boolean equals(Object o)
	{
		if (this == o){
			return true;
		}

		if (o == null || getClass() != o.getClass()){
			return false;
		}


		JxbPoJo jxbPoJo = (JxbPoJo) o;

		return Id.equals(jxbPoJo.Id);
	}

	@Override
	public int hashCode()
	{
		return Id.hashCode();
	}

3、两个集合取交并集的方法

/**
	 * 获取两个ArrayList的交集
	 *
	 * @param firstArrayList  第一个 ArrayList 集合
	 * @param secondArrayList 第二个 ArrayList 集合
	 * @return
	 */
	public static <T> List<T> receiveCollectionList(List<T> firstArrayList, List<T> secondArrayList)
	{
		if (firstArrayList == null || firstArrayList.size() == 0 || secondArrayList == null || secondArrayList.size() == 0)
		{
			return null;
		}
		/** 大集合用 LinkedList **/
		LinkedList<T> result = new LinkedList<T>(firstArrayList);
		/** 小集合用 HashSet **/
		HashSet<T> othHash = new HashSet<T>(secondArrayList);
		/** 采用Iterator迭代器进行数据的操作 **/
		result.removeIf(t -> !othHash.contains(t));

		return new ArrayList<>(result);
	}

	/**
	 * @param firstArrayList  第一个ArrayList
	 * @param secondArrayList 第二个ArrayList
	 * @return resultList 差集ArrayList
	 * @方法描述:获取两个ArrayList的差集
	 */
	public static <T> List<T> receiveDefectList(List<T> firstArrayList, List<T> secondArrayList)
	{
		List<T> resultList = new ArrayList<T>();
		// 大集合用linkedlist
		LinkedList<T> result = new LinkedList<T>(firstArrayList);
		// 小集合用hashset
		HashSet<T> othHash = new HashSet<T>(secondArrayList);
		// 采用Iterator迭代器进行数据的操作
		result.removeIf(othHash::contains);
		resultList = new ArrayList<>(result);
		firstArrayList.clear();
		firstArrayList.addAll(resultList);
		return firstArrayList;
	}

相关文章:

https://blog.csdn.net/weixin_41922349/article/details/108759956

https://blog.csdn.net/tiger0709/article/details/81474461

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值