方法一、ArrayList中提供的removeAll方法(效率最低)
List1.removeAll(mSubList);
方法二、双重循环(比方法一效率高)

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

int maxSize = List1.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(List1.get(i))) {
mSubList.remove(size-1);
List1.remove(i);
break;
}
size--;
}
}
方法三、利用HashMap(效率最高)
//第一步:构建list的HashMap,将list中的元素作为键,将list中的元素对应的位置作为值
// 如果不是String类,需要实现hashCode,equals方法,equals不一定要调用,但是一定要书写
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < List1.size(); i++) {
map.put(List1.get(i), i);
}
//第二步:利用map遍历mSubList,查找重复元素
//把List1中所有查到的重复元素的位置置空
for (int i = 0; i < mSubList.size(); i++) {
Integer pos = map.get(mSubList.get(i));
if (pos==null) {
continue;
}
List1.set(pos, null);
}
//第三步:把List1中所有的空元素移除
for (int i = List1.size()-1; i>=0; i--) {
if (List1.get(i)==null) {
List1.remove(i);
}
}
方法三的一些说明
  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. 第三步中,从List1尾部开始遍历移除

Java ArrayList使用技巧 - 两个ArrayList去除重复的元素的更多相关文章

  1. 数据库小技巧:使用distinct去除重复行

    这里有2个表 问题question表 楼层question_floor表 需求:已知某用户的id为uid,实现“我的回复”功能,即查看我回复的所有问题 遇到的问题:如果直接对question表和que ...

  2. List去除重复的元素

         有两种方法,一种是去重不带顺序的,一种是去重带顺序的. /* * 方法1: 无顺序 * Hastset根据hashcode判断是否重复,数据不会重复 */ public static Lis ...

  3. python 列表(list)去除重复的元素总结

    方法一: 将list作为set的构造函数构造一个set,然后再将set转换会list就可以 >>> myList = [1, 2, 3, 3, 2, 2, 4, 5, 5] > ...

  4. vector去除重复的元素

    vector<int> v; sort(v.begin(),v.end()); v.erase(unique(v.begin(), v.end()), v.end());

  5. ArrayList去除重复元素(包括字符串和自定义对象)

    1.去除重复字符串 package com.online.msym; import java.util.ArrayList; import java.util.Iterator; @SuppressW ...

  6. Java实现数组去除重复数据的方法详解

    一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer ...

  7. JAVA数组去除重复数据

    一.用List集合实现   , , , , , , ,}; List<Integer> list = new ArrayList<Integer>(); ; i<str. ...

  8. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  9. LintCode 521.去除重复元素

    LintCode 521.去除重复元素 描述 给一个整数数组,去除重复的元素. 你应该做这些事 1.在原数组上操作 2.将去除重复之后的元素放在数组的开头 3.返回去除重复元素之后的元素个数 挑战 1 ...

随机推荐

  1. BiLSTM介绍

    https://www.jiqizhixin.com/articles/2018-10-24-13 (机器之心)

  2. frp使用(windows+aliyun-windows)

    下载frp:https://github.com/fatedier/frp/releases/ 解压,修改服务端配置文件:frps.ini:如下: [common] # 设置连接端口 bind_por ...

  3. BZOJ 4289 最短路+优化建图

    题意:给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权. 解法:参考h ...

  4. STL_set

    #include <iostream> #include <set> #include <string> #include <cstdio> using ...

  5. jsp EL运算符

    算术运算符 算术运算符 说明 示例 结果 + 加 ${1 + 1} 2 - 减 ${1 - 1} 0 * 乘 ${1 * 2} 2 /或div 除 ${3 / 2} 1.5 %或mod 取余 ${3 ...

  6. Dart编程实例 - 第一个Dart程序

    Dart编程实例 - 第一个Dart程序 main() { print("Hello World!"); } 本文转自:http://codingdict.com/article/ ...

  7. PHP FILTER_SANITIZE_EMAIL 过滤器

    定义和用法 FILTER_SANITIZE_EMAIL 过滤器删除字符串中所有非法的 e-mail 字符. 该过滤器允许所有的字母.数字以及 $-_.+!*'{}|^~[]`#%/?@&= N ...

  8. Springboot Excle导入导出

    Springboot Excle导入导出 导入操作:Excle批量导入 导出操作:下载模版 开发笔记 pom.xml <!-- Excle相关jar --> <dependency& ...

  9. NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)

    Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...

  10. Chrome 调试跨域问题解决方案之插件篇

    跨域,就是A域名下的js,想请求B域名下的接口数据.跨域,只存在于浏览器端.App和小程序不存在跨域问题.跨域,分浏览器策略和服务器策略. 如果服务器配置了允许跨域,那就没有跨域问题 如果uni-ap ...