Java-ArrayList使用技巧---从第一个List中去除所有第二个List中与之重复的元素
需求:从 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
方法三的一些说明
- 方法三中初始化HashMap的时候已经知道了容量大小,理论上直接指定HashMap的大小避免扩容可以提高效率,但是测试发现并没有提高,100000条数据都是几十毫秒
- 虽然方法三中HashMap存的值是整数,但是不要使用
int pos = map.get(mSubList.get(i));
取值,会崩溃 - 第二步中,使用
Integer pos = map.get(mSubList.get(i));
取值,然后判断 pos 是否是空来判断map中是否包含键是mSubList.get(i)
的值,比用map.containsKey(key)来判断然后get取值少访问一次哈希表 - 第三步中,从mAllList尾部开始遍历移除
HashMap不了解的可以看下Java HashMap原理解析
转载于:https://www.cnblogs.com/developerzjy/p/11084182.html
Java-ArrayList使用技巧---从第一个List中去除所有第二个List中与之重复的元素相关推荐
- Java语言程序设计与数据结构(基础篇)梁勇第二章书中例题
程序清单2-1:ComputeArea.java public class ComputeArea {public static void main(String[] args) {// TODO A ...
- java arraylist 合并_在Java中将两个arrayList合并到一个新的arrayList中,没有重复且没有顺序...
我试图"合并"两个arrayList,产生一个新的arrayList,其中包含两个组合arrayLists中的所有数字,但没有任何重复的元素,它们应该是有序的.我想出了下面的这段代 ...
- java arraylist插入_java ArrayList数组中如何插入一个元素
java ArrayList数组中如何插入一个元素 比如: ArrayList myList = new ArrayList(): myList.add(0); myList.add(1); myLi ...
- Java性能优化技巧
Java性能优化技巧 参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序 ...
- 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
转载自 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧 目录: 框架是重点,但别让人感觉你只会山寨别人的代码 别只看单机版的框架,分布式也需要了解 对于数据库,别只知道增删改查,得了解 ...
- 提高效率的Java代码优化小技巧
可以提高效率的Java代码优化小技巧 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面 ...
- java arraylist下标从几开始_ArrayList——JAVA成长之路
1.1.ArrayList概述 1)ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类. 2)该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capac ...
- java arraylist 方法返回值_返回arraylist方法
ArrayList 什么是ArrayList 可以简单的认为是一个动态数组:实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数 ...
- java字符存储_用java的类集框架做一个字符存储器(15)
11.这是java的关于java的类集框架做一个字符存储器的源代码可以直接进行编译运行,希望大家能够从中获益良多. package niming; //导入ArrayList这个类 import ja ...
最新文章
- base64开源库介绍及使用
- Hibernate ORM框架——连接池相关
- ajax实现重新绘图,如何画Flot AJAX更新图
- UE4如何解析命令行参数
- 在Linux系统下初始化COM组件,Linux操作系统的引导和初始化.doc
- 输入法分类总结与优缺点
- 小米8 解BL锁教程 申请BootLoader解锁教程
- 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
- 【JY】为什么要了解和学习多款仿真软件?
- 基于CocosCreator的切水果小游戏(二)
- Python爬虫学习笔记-第二课(网络请求模块上)
- 公钥密码的三大数学问题
- mmdetection报错 TypeError: vars() argument must have __dict__ attribute
- 大疆睿炽Tello EDU无人机python操控之二——使用Tello-Python-master示例程序控制Tello EDU无人机
- Vue渲染器(一):渲染器的设计
- Worthington弹性蛋白酶的应用和相关研究
- JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能
- 腾讯视频怎么录屏,腾讯视频怎么截长视频
- 51 SJA1000驱动程序
- dm365启动分析以及RBL、UBL、Uboot的简单介绍
热门文章
- java中servlet知识_jsp_Servlet常用知识总结
- mlag 堆叠_S-MLAG解决方案介绍
- bat 取得服务列表_解读浩泽净水2018业绩:稳定增长背后的服务深化和科技跃进...
- Web前端期末大作业--汽车主题网页设计002(HTML+CSS+JavaScript+)实现
- css动画改变高度有过渡效果,css3-形变、过渡、动画
- notification源码分析_Ceilometer之notification agent代码分析
- java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...
- IOS中的事件响应链,事件冒泡机制基本了解
- Spring基于Annotation实现事务管理
- Spring自动装配Bean