加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

Java中5种List的去重方法及它们的效率对比,你用对了吗?

发布时间:2020-12-15 02:14:00 所属栏目:C语言 来源:网络整理
导读:? 01、使用两个for循环实现List去重(有序) ? ????/**使用两个for循环实现List去重(有序) ?????* ?????*?@param?list ?????*?*/ ????public?static?List?removeDuplicationBy2For(ListInteger?list)?{ ????????for?(int?i=0;ilist.size();i++) ????????{ ????


?

01、使用两个for循环实现List去重(有序)

?

????/**使用两个for循环实现List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationBy2For(List<Integer>?list)?{
????????for?(int?i=0;i<list.size();i++)
????????{
????????????for?(int?j=i+1;j<list.size();j++)
????????????{
????????????????if(list.get(i).equals(list.get(j))){
????????????????????list.remove(j);
????????????????}
????????????}
????????}
????????return?list;
????}

02、使用List集合contains方法循环遍历(有序)

?

????/**使用List集合contains方法循环遍历(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByContains(List<Integer>?list)?{
????????List<Integer>?newList?=new?ArrayList<>();
????????for?(int?i=0;i<list.size();i++)
????????{
????????????boolean?isContains?=newList.contains(list.get(i));
????????????if(!isContains){
????????????????newList.add(list.get(i));
????????????}
????????}
????????list.clear();
????????list.addAll(newList);
????????return?list;
????}

03、使用HashSet实现List去重(无序)

?

????/**使用HashSet实现List去重(无序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByHashSet(List<Integer>?list)?{
????????HashSet?set?=?new?HashSet(list);
????????//把List集合所有元素清空
????????list.clear();
????????//把HashSet对象添加至List集合
????????list.addAll(set);
????????return?list;
????}

04、使用TreeSet实现List去重(有序)

?

????/**使用TreeSet实现List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByTreeSet(List<Integer>?list)?{
????????TreeSet?set?=?new?TreeSet(list);
????????//把List集合所有元素清空
????????list.clear();
????????//把HashSet对象添加至List集合
????????list.addAll(set);
????????return?list;
????}

05、使用java8新特性stream实现List去重(有序)

?

????/**使用java8新特性stream实现List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByStream(List<Integer>?list)?{
????????List?newList?=?list.stream().distinct().collect(Collectors.toList());
????????return?newList;
????}

效率测试代码

?

????public?static?void?main(String?args[])?{
????????List<Integer>?list1?=?new?ArrayList<>();
????????List<Integer>?list2?=?new?ArrayList<>();
????????List<Integer>?list3?=?new?ArrayList<>();
????????List<Integer>?list4?=?new?ArrayList<>();
????????List<Integer>?list5?=?new?ArrayList<>();
????????Random?random?=new?Random();
????????for?(int?i?=?0;?i?<?100000;?i++)?{
????????????int?value?=random.nextInt(500);
????????????list1.add(value);
????????????list2.add(value);
????????????list3.add(value);
????????????list4.add(value);
????????????list5.add(value);
????????}
????????long?startTime?;
????????long?endTime;
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByHashSet(list1);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用HashSet实现List去重时间:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByTreeSet(list2);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用TreeSet实现List去重时间:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByStream(list3);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用java8新特性stream实现List去重:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationBy2For(list4);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用两个for循环实现List去重:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByContains(list5);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用List集合contains方法循环遍历:"+(endTime-startTime)+"毫秒");
?
????}

结果:

  • 使用HashSet实现List去重时间:40毫秒

  • 使用TreeSet实现List去重时间:36毫秒

  • 使用java8新特性stream实现List去重:78毫秒

  • 使用两个for循环实现List去重:533毫秒

  • 使用List集合contains方法循环遍历:40毫秒

更多测试结果

随机数在100范围内:

  • 使用HashSet实现List去重时间:32毫秒

  • 使用TreeSet实现List去重时间:40毫秒

  • 使用java8新特性stream实现List去重:128毫秒

  • 使用两个for循环实现List去重:693毫秒

  • 使用List集合contains方法循环遍历:30毫秒

随机数在1000范围内:

  • 使用HashSet实现List去重时间:34毫秒

  • 使用TreeSet实现List去重时间:72毫秒

  • 使用java8新特性stream实现List去重:125毫秒

  • 使用两个for循环实现List去重:1063毫秒

  • 使用List集合contains方法循环遍历:85毫秒

随机数在10000范围内:

  • 使用HashSet实现List去重时间:51毫秒

  • 使用TreeSet实现List去重时间:103毫秒

  • 使用java8新特性stream实现List去重:201毫秒

  • 使用两个for循环实现List去重:5448毫秒

  • 使用List集合contains方法循环遍历:791毫秒

结论

无序HashSet,有序TreeSet

Java 的知识面非常广,面试问的涉及也非常广泛,重点包括:Java 基础、Java 并发,JVM、MySQL、数据结构、算法、Spring、微服务、MQ 等等,涉及的知识点何其庞大,所以我们在复习的时候也往往无从下手,今天小编给大家带来一套 Java 面试题,题库非常全面,包括 Java 基础、Java 集合、JVM、Java 并发、Spring全家桶、Redis、MySQL、Dubbo、Netty、MQ 等等,包含 Java 后端知识点 2000 +?

资料获取方式:关注公众号:“程序员白楠楠”获取上述资料

?

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读