zoukankan      html  css  js  c++  java
  • Java ArrayList使用技巧

    方法一、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尾部开始遍历移除
  • 相关阅读:
    Think 框架漏洞利用
    提权篇之简单介绍和exp利用过程
    webshell提权20种思路
    黑吃黑,大神实操带你破解菠菜平台
    知道这20个正则表达式,能让你少写1,000行代码
    Spring与Quartz的整合实现定时任务调度
    关于MySQL的wait_timeout连接超时问题报错解决方案
    SpringMVC 400 Bad Request 问题
    java 细说String
    最详细的Log4j使用教程
  • 原文地址:https://www.cnblogs.com/czq520/p/11646406.html
Copyright © 2011-2022 走看看