方法一、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. redis Hash相关命令

  2. 在linux上安装jdk

    一.环境 1.  VMware虚拟机 2.  Linux系统(centos7) 安装步骤: 1.  先安装VMtools 2.  查看是否有openjdk,若有先将系统内的openJDK删除(采用 r ...

  3. Centos6.6安装JDK1.8

    首先从官网下载jdk1.8,地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  4. 通过list中值得名称查询索引号

    >>> a = ['www','iplaypython','com']>>> a.index('iplaypython')

  5. vue之全局自定义组件

    在项目开发中,往往需要使用到一些公共组件,比如,弹出消息.面包屑或者其它的组件,为了使用方便,将其以插件的形式融入到vue中,以面包屑插件为例: 1.创建公共组件MyBread.vue <tem ...

  6. Oracle实现主键自增的几种方式

    数据库作为一个系统的核心,数据库设计的1NF就是一个表结构必须有唯一约束也就是主键,Oracle数据库本身没有自增机制,不像MySQL直接使用关键字AUTO_INCREMENT自动加一,所以需要我们去 ...

  7. centos 6.5 修改主机名

    使用 root 账号登录,编辑 vi /etc/sysconfig/network 此时的主机名如下 HOSTNAME=localhost.localdomain 修改 HOSTNAME=newnam ...

  8. Python删除文件夹

    import os os.rmdir('OS-Demo-2') os.removedirs('OS-Demo-3/sub-Dir-1') os.removedirs()会自动将上一级文件夹也删除,谨慎 ...

  9. 【leetcode】667. Beautiful Arrangement II

    题目如下: Given two integers n and k, you need to construct a list which contains ndifferent positive in ...

  10. ToDoList 增删改查

    ToDoList 主要功能 增加数据 删除数据 修改数据 查寻数据渲染页面 1 . HTML页面 <!DOCTYPE html> <html lang="en"& ...