一道比较简单的java面试题,一个list中存放string,例如存放人名,而且这个list的size比较大,现在要求去除该list中的名字为姓“张”的所有元素,至今没有想到很好的方法,自己只知道三种方法,求大神给予更好的答案,性能越高越好,谢谢~
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import org.junit.Before;
public class ModifyList {
public List<String> lists=null;
String[] prefixName = new String[]{"赵","钱","孙","李","张","陈"};
String[] suffixName = new String[]{"子涵","心怡","子墨","梦瑶","浩轩","轩","俊熙","可馨","睿","思彤","思诚","丹"};
@Before
public void before(){
lists=new ArrayList<String>();
Random random=new Random();
int i=0;
while(i<50000){
int prefix=random.nextInt(6);
int suffix=random.nextInt(12);
String name=prefixName[prefix]+suffixName[suffix];
lists.add(name);
i++;
}
}
@org.junit.Test(expected=ConcurrentModificationException.class)
public void remove1(){
for(String name:lists){
if(name!=null&name.indexOf("张")>-1){
lists.remove(name);
}
}
System.out.println(lists);
}
/**
* 该方法适用于去除唯一一个不合适的值,效率最高
*/
@org.junit.Test
public void remove2(){
for(String name:lists){
if(name!=null&name.indexOf("张")>-1){
lists.remove(name);
break;
}
}
System.out.println(lists);
}
/**
* 该方法没有报错,因为每次都去获取lists.size
* 不会抛出ConcurrentModificationException异常
* 但如果连续的list中有连续的姓张的在一起,就会出现不删除现象
* 当i=0时,删除“张三”,此时“张九”的下标变为0,i=1,此时就不会对“张九”做处理
*/
@org.junit.Test
public void remove3(){
for(int i=0;i<lists.size();i++){
if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){
lists.remove(i);
}
}
System.out.println(lists);
}
/**
* 正确方法一
*/
@org.junit.Test
public void remove4(){
long begin=System.currentTimeMillis();
System.out.println(begin);
Iterator<String> iters = lists.iterator();
while(iters.hasNext()){
String name=iters.next();
if(name!=null&name.indexOf("张")>-1){
iters.remove();
}
}
long end=System.currentTimeMillis();
System.out.println(end);
System.out.println(end-begin);
/*System.out.println(lists);*/
}
/**
* 正确方法二
*/
@org.junit.Test
public void remove5(){
long begin=System.currentTimeMillis();
System.out.println(begin);
for(int i=0;i<lists.size();i++){
if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){
lists.remove(i);
i--;
}
}
long end=System.currentTimeMillis();
System.out.println(end);
System.out.println(end-begin);
//System.out.println(lists);
}
/**
* 正确方法三,效率最高,其实不算去除
*/
@org.junit.Test
public void remove6(){
List<String> list2=new ArrayList<String>();
long begin=System.currentTimeMillis();
System.out.println(begin);
for(String name:lists){
if(name!=null&name.indexOf("张")<0){
list2.add(name);
}
}
long end=System.currentTimeMillis();
System.out.println(end);
System.out.println(end-begin);
//System.out.println(list2);
}
}