需求:从 mAllList 中去除所有 mSubList 中与之重复的元素
测试数据:mAllList 中包含100000个无序无重复字符串,mSubList 中包含50000个无序无重复字符串

方法一、ArrayList中提供的removeAll方法(效率最低)
mAllList.removeAll(mSubList);

某次测试耗时:185665ms

方法二、双重循环(比方法一效率高)

双重循环分为内外两层循环,经过测试,将元素多的list放在外层循环效率更高(mSubList中的元素可能比mAllList多)(被删除元素的列表mAllList放在外层循环和内层循环的实现方式有些差别),这里的测试数据是mAllList中的元素多,实现如下:

int maxSize = mAllList.size();
for (int i = maxSize-1; i >=0; i--) {int size = mSubList.size();while (size > 0) {String s = mSubList.get(size-1);if (s.equals(mAllList.get(i))) {mSubList.remove(size-1);mAllList.remove(i);break;}size--;}
}

某次测试耗时:101510ms

方法三、利用HashMap(效率最高)
//第一步:构建mAllList的HashMap
//将mAllList中的元素作为键,如果不是String类,需要实现hashCode和equals方法
//将mAllList中的元素对应的位置作为值
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < mAllList.size(); i++) {map.put(mAllList.get(i), i);
}
//第二步:利用map遍历mSubList,查找重复元素
//把mAllList中所有查到的重复元素的位置置空
for (int i = 0; i < mSubList.size(); i++) {Integer pos = map.get(mSubList.get(i));if (pos==null) {continue;}mAllList.set(pos, null);
}
//第三步:把mAllList中所有的空元素移除
for (int i = mAllList.size()-1; i>=0; i--) {if (mAllList.get(i)==null) {mAllList.remove(i);}
}

某次测试耗时:712ms

方法三的一些说明
  1. 方法三中初始化HashMap的时候已经知道了容量大小,理论上直接指定HashMap的大小避免扩容可以提高效率,但是测试发现并没有提高,100000条数据都是几十毫秒
  2. 虽然方法三中HashMap存的值是整数,但是不要使用int pos = map.get(mSubList.get(i));取值,会崩溃
  3. 第二步中,使用Integer pos = map.get(mSubList.get(i));取值,然后判断 pos 是否是空来判断map中是否包含键是mSubList.get(i)的值,比用map.containsKey(key)来判断然后get取值少访问一次哈希表
  4. 第三步中,从mAllList尾部开始遍历移除

HashMap不了解的可以看下Java HashMap原理解析

转载于:https://www.cnblogs.com/developerzjy/p/11084182.html

Java-ArrayList使用技巧---从第一个List中去除所有第二个List中与之重复的元素相关推荐

  1. Java语言程序设计与数据结构(基础篇)梁勇第二章书中例题

    程序清单2-1:ComputeArea.java public class ComputeArea {public static void main(String[] args) {// TODO A ...

  2. java arraylist 合并_在Java中将两个arrayList合并到一个新的arrayList中,没有重复且没有顺序...

    我试图"合并"两个arrayList,产生一个新的arrayList,其中包含两个组合arrayLists中的所有数字,但没有任何重复的元素,它们应该是有序的.我想出了下面的这段代 ...

  3. java arraylist插入_java ArrayList数组中如何插入一个元素

    java ArrayList数组中如何插入一个元素 比如: ArrayList myList = new ArrayList(): myList.add(0); myList.add(1); myLi ...

  4. Java性能优化技巧

    Java性能优化技巧 参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序 ...

  5. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧

    转载自  面试了 N 个候选人后,我总结出这份 Java 面试准备技巧 目录: 框架是重点,但别让人感觉你只会山寨别人的代码 别只看单机版的框架,分布式也需要了解 对于数据库,别只知道增删改查,得了解 ...

  6. 提高效率的Java代码优化小技巧

    可以提高效率的Java代码优化小技巧 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面 ...

  7. java arraylist下标从几开始_ArrayList——JAVA成长之路

    1.1.ArrayList概述 1)ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类. 2)该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capac ...

  8. java arraylist 方法返回值_返回arraylist方法

    ArrayList 什么是ArrayList 可以简单的认为是一个动态数组:实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数 ...

  9. java字符存储_用java的类集框架做一个字符存储器(15)

    11.这是java的关于java的类集框架做一个字符存储器的源代码可以直接进行编译运行,希望大家能够从中获益良多. package niming; //导入ArrayList这个类 import ja ...

最新文章

  1. base64开源库介绍及使用
  2. Hibernate ORM框架——连接池相关
  3. ajax实现重新绘图,如何画Flot AJAX更新图
  4. UE4如何解析命令行参数
  5. 在Linux系统下初始化COM组件,Linux操作系统的引导和初始化.doc
  6. 输入法分类总结与优缺点
  7. 小米8 解BL锁教程 申请BootLoader解锁教程
  8. 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
  9. 【JY】为什么要了解和学习多款仿真软件?
  10. 基于CocosCreator的切水果小游戏(二)
  11. Python爬虫学习笔记-第二课(网络请求模块上)
  12. 公钥密码的三大数学问题
  13. mmdetection报错 TypeError: vars() argument must have __dict__ attribute
  14. 大疆睿炽Tello EDU无人机python操控之二——使用Tello-Python-master示例程序控制Tello EDU无人机
  15. Vue渲染器(一):渲染器的设计
  16. Worthington弹性蛋白酶的应用和相关研究
  17. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能
  18. 腾讯视频怎么录屏,腾讯视频怎么截长视频
  19. 51 SJA1000驱动程序
  20. dm365启动分析以及RBL、UBL、Uboot的简单介绍

热门文章

  1. java中servlet知识_jsp_Servlet常用知识总结
  2. mlag 堆叠_S-MLAG解决方案介绍
  3. bat 取得服务列表_解读浩泽净水2018业绩:稳定增长背后的服务深化和科技跃进...
  4. Web前端期末大作业--汽车主题网页设计002(HTML+CSS+JavaScript+)实现
  5. css动画改变高度有过渡效果,css3-形变、过渡、动画
  6. notification源码分析_Ceilometer之notification agent代码分析
  7. java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...
  8. IOS中的事件响应链,事件冒泡机制基本了解
  9. Spring基于Annotation实现事务管理
  10. Spring自动装配Bean