?
? 一道比较简单的java面试题,一个list中存放string,例如存放人名,而且这个list的size比较大,现在要求去除该list中的名字为姓“张”的所有元素,至今没有想到很好的方法,自己只知道三种方法,求大神给予更好的答案,性能越高越好,谢谢~
?
class="java" name="code">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); } }
?