【性能优化】使用Set的contains方法替代List的contains方法

今天在调优的过程中发现某一个接口有些慢,sql查询不到一秒,整体接口返回数据达到3、4秒。
先上代码:

List<String> feedAccount = feedHomePageService.selectFeedAccount();

accountNewList.removeIf(o -> !feedAccount.contains(o.getAdvertiserId()));

accountNewList大概12W条数据,整个过滤下来大概花费3~4秒

改成set之后:

List<String> feedAccount = feedHomePageService.selectFeedAccount();
long time = System.currentTimeMillis();
// set去重要比list效率高
Set<String> feedAccountSet = new HashSet<>(feedAccount);
        accountNewList.removeIf(o -> !feedAccountSet.contains(o.getAdvertiserId()));
LogUtil.info(logger, "feedAccountSet remove account by feedAccount", System.currentTimeMillis() - time);

从输出日志可以看出效率瞬间提升,只用了12ms

[INFO] [2021-11-23 11:08:44][com.xx.xx.xx.xx.homepage.HomePageService]4b1dc5a6-5519-4432-86fd-f19263aa9412 xxx@xxx feedAccountSet remove account by feedAccount 12

分析:
set的HashSet.contains()方法,底层是通过HashMap来实现的。而HashMap的查找速度是很快的

List和Set contains原理实现大家可以看一这篇文章:
List和Set contains原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码场小兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值