【Java】List集合移除比较

list在remove很容易报错,原因是,如果前面的元素被remove了,他的位置会被后面的元素挤掉,如果后面的这个元素正好是我们需要remove的,那么就会报错,下面写了3中安全的list集合remove方法比较,大家可以看看,这里增加了运行时间项目,用于粗略比较;用于比较性能,有精力的同学可以跑个十万次,百万次的数量级;

1、常规的for循环,但是从后往前remove

package listRemove;

import java.util.ArrayList;
import java.util.List;

public class listRemoveMine {
    public static void main(String[] args) {
        //准备数组
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(1);
        list.add(39);
        list.add(39);
        list.add(2);
        list.add(28);
        list.add(12);

        long startTime =System.currentTimeMillis();
       List<Integer> integerList=removeList(list,16);
        long endTime=System.currentTimeMillis();
        System.out.println("共计耗时"+(endTime-startTime)+"ms");
    }

    private static List<Integer> removeList(List<Integer> list,int valve){
        int count=1;
        int size=list.size();
        for (int i=0;i<size;i++){
            int indexFromEnd=size-i-1;
            if (list.get(indexFromEnd)<valve){
                System.out.println(count+"、被移除的对象"+list.get(indexFromEnd).toString());
                list.remove(indexFromEnd);
                System.out.println("list中剩余的对象"+list.toString());
            }else {
                System.out.println(count+"、本次没有移除元素");
                System.out.println("list中剩余的对象"+list.toString());
            }
            count++;
            System.out.println("size大小为:"+size);
            System.out.println("****************************");
        }
        return list;
    }
}

这里写图片描述

打印日志:

"C:\Program Files\Java\jdk1.8.0_91\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.4\lib\idea_rt.jar=50005:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_91\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar;C:\Program Files\Java\jdk1.6.0_45\jre\lib\rt.jar;E:\MyDemo\myTestDemo\target\classes;E:\MyDemo\myTestDemo\lib\spring-aspects-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-context-support-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-aop-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-expression-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-instrument-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-instrument-tomcat-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-beans-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-context-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-jdbc-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-jms-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-oxm-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-messaging-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-core-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\commons-logging-1.2.jar;E:\MyDemo\myTestDemo\lib\aopalliance-1.0.jar;E:\MyDemo\myTestDemo\lib\spring-orm-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-tx-4.3.14.RELEASE.jar;E:\MyDemo\myTestDemo\lib\spring-test-4.3.14.RELEASE.jar;C:\Users\Administrator\.m2\repository\com\alibaba\fastjson\1.2.31\fastjson-1.2.31.jar;C:\Users\Administrator\.m2\repository\com\alibaba\druid\1.0.20\druid-1.0.20.jar;C:\Program Files\Java\jdk1.8.0_91\lib\jconsole.jar;C:\Program Files\Java\jdk1.8.0_91\lib\tools.jar;C:\Users\Administrator\.m2\repository\javax\persistence\persistence-api\1.0\persistence-api-1.0.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;C:\Users\Administrator\.m2\repository\commons-lang\commons-lang\2.4\commons-lang-2.4.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-client\1.9.1\jersey-client-1.9.1.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-core\1.9.1\jersey-core-1.9.1.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\jersey-json\1.19\jersey-json-1.19.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jettison\jettison\1.1\jettison-1.1.jar;C:\Users\Administrator\.m2\repository\com\sun\xml\bind\jaxb-impl\2.2.3-1\jaxb-impl-2.2.3-1.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.2.2\jaxb-api-2.2.2.jar;C:\Users\Administrator\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;C:\Users\Administrator\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-jaxrs\1.9.2\jackson-jaxrs-1.9.2.jar;C:\Users\Administrator\.m2\repository\org\codehaus\jackson\jackson-xc\1.9.2\jackson-xc-1.9.2.jar;C:\Users\Administrator\.m2\repository\com\google\code\gson\gson\2.2.2\gson-2.2.2.jar;C:\Users\Administrator\.m2\repository\com\sun\jersey\contribs\jersey-multipart\1.18\jersey-multipart-1.18.jar;C:\Users\Administrator\.m2\repository\org\jvnet\mimepull\mimepull\1.9.3\mimepull-1.9.3.jar;C:\Users\Administrator\.m2\repository\commons-httpclient\commons-httpclient\3.1-rc1\commons-httpclient-3.1-rc1.jar;C:\Users\Administrator\.m2\repository\commons-logging\commons-logging\1.0.4\commons-logging-1.0.4.jar;C:\Users\Administrator\.m2\repository\commons-codec\commons-codec\1.2\commons-codec-1.2.jar;C:\Users\Administrator\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar" listRemove.listRemoveMine
1、被移除的对象12
list中剩余的对象[1, 1, 39, 39, 2, 28]
size大小为:7
****************************
2、本次没有移除元素
list中剩余的对象[1, 1, 39, 39, 2, 28]
size大小为:7
****************************
3、被移除的对象2
list中剩余的对象[1, 1, 39, 39, 28]
size大小为:7
****************************
4、本次没有移除元素
list中剩余的对象[1, 1, 39, 39, 28]
size大小为:7
****************************
5、本次没有移除元素
list中剩余的对象[1, 1, 39, 39, 28]
size大小为:7
****************************
6、被移除的对象1
list中剩余的对象[1, 39, 39, 28]
size大小为:7
****************************
7、被移除的对象1
list中剩余的对象[39, 39, 28]
size大小为:7
****************************
共计耗时10ms

Process finished with exit code 0

运行结果在0-20ms之间;

2、Iterator迭代器比较,最安全的比较

这里写图片描述

迭代器比较,几乎每次耗时都是0ms…耗时最少;

代码如下:

package listRemove;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class listRemoveIterator {
    public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(1);
        list.add(39);
        list.add(39);
        list.add(2);
        list.add(28);
        list.add(12);

        long startTime =System.currentTimeMillis();

        Iterator<Integer> iter = list.iterator();
        while(iter.hasNext()){
            //list.remove(0);
            Integer it= iter.next();
            if(it>16){
                iter.remove();
            }
        }
        long endTime=System.currentTimeMillis();
        System.out.println("共计耗时"+(endTime-startTime)+"ms");


    }
}

3、lambda表达式写法

这里写图片描述

lambda表达式的运行时间基本在100ms左右;而且,现在已经不支持了:
这里写图片描述

解决办法:
这里写图片描述

package listRemove;

import java.util.ArrayList;
import java.util.List;

public class listRemoveLambda {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(1);
        list.add(39);
        list.add(39);
        list.add(2);
        list.add(28);
        list.add(12);

        //移除
        long startTime =System.currentTimeMillis();
        list.removeIf( i -> ( i <16 ) );
        list.forEach(System.out::println);
        long endTime=System.currentTimeMillis();
        System.out.println("共计耗时"+(endTime-startTime)+"ms");

    }
}

所以,最优解是Iterator!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值