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");
}
}