set list的区别以及它们的contains效率问题

代码中将List转换为HashSet的主要原因是利用HashSet的高效contains方法。HashSet在查找元素时平均时间复杂度为O(1),而List的contains方法在最坏情况下时间复杂度为O(n)。此外,转换为HashSet还能自动去除重复元素。博客作者通过实验得出结论,HashSet的contains方法在查询速度上优于ArrayList。因此,这段代码在优化查询性能的同时去除了重复的attrIds。

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

跟着大神溜代码,有个操作:

List<Long> searchAttrIds = attrService.selectSearchAttrs(attrIds);

Set<Long> idSet = new HashSet<>(searchAttrIds);

 List<SkuEsModel.Attrs> attrList = baseAttrs.stream().filter(item -> {
      return idSet.contains(item.getAttrId());
  }).map(item -> {
      SkuEsModel.Attrs attrs1 = new SkuEsModel.Attrs();
      BeanUtils.copyProperties(item, attrs1);
      return attrs1;
  }).collect(Collectors.toList());

他的一个操作让我困惑

为什么Set idSet = new HashSet<>(searchAttrIds);后再idSet.contains(item.getAttrId());
为什么不直接list搞起来

折腾:list set区别:

List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。 很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

针对它们的contains:
拜读了大神的实验结论:
大神的实验过程记录如其地址
https://www.cnblogs.com/jiadp/p/9259522.html

他的结论:

总结:使用contains方法查询元素是否存在HashSet要比ArrayList快的多。

回到代码,总结有两个好处:
操作: Set<Long> idSet = new HashSet<>(searchAttrIds);
    1.这个操作会过滤掉searchAttrIds的重复元素
    2.HashSet.contains 比list.contains效率要高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

溜达的大象

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

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

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

打赏作者

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

抵扣说明:

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

余额充值