现在有一个list 里面有null元素,list.add(0,"2");list.add(1,null);list.add(2,"2");
用List lis = new ArrayList();
lis.add(null);
list.removeAll(lis);
请教各位,这样做好么,老是感觉不好!

解决方案 »

  1.   

    用第三方包排序,list中放的bean,按照bean的属性对list排序,但是中间不能出现null,要不报错 
      

  2.   

    你的方法看起来是不好。但是我认为你可以放心,效率不会低。因为ArrayList和LinkedList等实现了List接口的类,都会重写removeAll()方法,而且会保证算法的复杂度为O(m*n)。也就是对于a.removeAll(b)最坏情况下,要进行a.size()*b.size()次操作。但你只是要移除null,所以只会进行a.size()次操作就行了。以上是我个人观点,测试如下。测试代码:import java.util.*;public class Temp {
    public static void main(String[] args) {
    int list_num, rmv_num;
    list_num = 100000;
    rmv_num = 100;
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < list_num; i++) {
    list.add(i % rmv_num);
    } List<Integer> l = new LinkedList<Integer>();
    for (int i = 0; i < rmv_num; i++) {
    l.add(i);
    } System.out.println("start size is: " + list.size());
    long timestart = new Date().getTime();
    list.removeAll(l);
    long timeend = new Date().getTime();
    System.out.println("need time(ms): " + (timeend - timestart));
    System.out.println("end size is: " + list.size());
    }
    }
    ------------------------------------------
    LinkedList:
    list_num    rmv_num     time(ms)
    100000      1           47
    100000      100         203
    100000      1000        1672
    10000       1000        234ArrayList:
    list_num    rmv_num     time(ms)
    100000      100         15953
    10000       100         219
    100000      1           12516
    10000       1           187
    ------------------------------------------以上代码先在list中插入list_num个对象,然后再将其全部移除,这是“很坏”的情况,上面的数据显示了两种常用的List的效率对比。可以看出,ArrayList在随list_num的增加而极剧增加;而LinkedList则比较像m*n。
    因为ArrayList是数组,在对象的删除时,要进行大量的数据移动,降低了效率。在List中如果要排序的话,最好还是避免null吧。