Java的API没有这样的函数,自己写的话也只能像你这样,没法再优化算法。
在你将对象分别放入list1、list2之前,为什么不直接就放到一个list中,就省得以后的合并了。
或者把list换成HashMap,HashMap不能存放重复的键值。

解决方案 »

  1.   

    看看这样效率怎么样?
    List result=new ArrayList(list1);
    list1.retainAll(list2);
    result.removeAll(list1);
    result.addAll(list2);
      

  2.   


    for(int i=0;i<list2.size();i++){
    if(!list1.contains(list2.get(i))){
    list1.add(list2.get(i));
    }
    }
      

  3.   

    问题:你的两个ArrayList是否有序?
    无序的话效率不会高,有序的话可以用归并排序。无序的话,对两个ArrayList使用快速排序,然后再用归并排序应该也比现在的效果好,因为现在的代码相当于2个循环的嵌套。
      

  4.   

    HashSet hs = new HashSet(list1);
    hs.addAll(list2);
      

  5.   

    import java.util.*;class Hashtab{
    public static int x = 6000;
    public static void main(String[] args) 
    {
    ArrayList list1 = new ArrayList();
    ArrayList list2 = new ArrayList(); for(int i=0;i<x;i++){
    list1.add("a_" + i);
    list2.add("b_" + i);
    }
    list2.add("a_1");

    System.out.println("====");

    long la = System.currentTimeMillis();
    test2(list1,list2);
    long lb = System.currentTimeMillis();
    System.out.println(lb -la);

    long lc = System.currentTimeMillis();
    test1(list1,list2);
    long ld = System.currentTimeMillis();
    System.out.println(ld -lc);

    long le = System.currentTimeMillis();
    test3(list1,list2);
    long lf = System.currentTimeMillis();
    System.out.println(lf -le); long lg = System.currentTimeMillis();
    test4(list1,list2);
    long lh = System.currentTimeMillis();
    System.out.println(lh -lg);

    System.out.println("====");
    } public static void test1(ArrayList list1,ArrayList list2){
    List result=new ArrayList();
    List temp=new ArrayList();
    for(int i=0;i<list2.size();i++){
    if(!list1.contains(list2.get(i))){
    temp.add(list2.get(i));
    }
    }
    result.addAll(list1);
    result.addAll(temp); } public static void test2(ArrayList list1,ArrayList list2){
    Hashtable hs = new Hashtable(); for(int i=0; i<list1.size(); i++){
    hs.put(list1.get(i),list1.get(i));
    }
    for(int i=0; i<list2.size(); i++){
    hs.put(list2.get(i),list2.get(i));
    } }
    public static void test3(ArrayList list1,ArrayList list2){
    for(int i=0;i<list2.size();i++){
    if(!list1.contains(list2.get(i))){
    list1.add(list2.get(i));
    }
    } } public static void test4(ArrayList list1,ArrayList list2){
    List result=new ArrayList(list1);
    list1.retainAll(list2);
    result.removeAll(list1);
    result.addAll(list2);
    }}
    test2好象是最快的。
      

  6.   

    LoveRose(旺旺)
    retainAll 方法是不是相当于两个list取了交集,那样的话就错了吧
    应该是两个list去减集
      

  7.   

    LoveRose(旺旺)
     bigc2001(大C)
    你们的方法我刚试过了,基本上没有变化,不过还是谢谢
      

  8.   

    真遗憾,不用自己写。把List转成Set就可以了。(new HashSet().addAll(list1)).addAll(list2).效率没有试验。不太清楚。希望试验过了说一声,谢了。
      

  9.   

    knight_qmh(辉)
    你的方法为什么无法避免重复?
    只是把两个list单纯的合并了,hashset好像没能实现唯一性
      

  10.   

    如果没有,是你的自定义类的问题,没有实现Comparable接口,没有写hashcode()方法,和equals()方法。我试验过重复性问题,一切ok。
      

  11.   

    equals我实现了
    hashcode()是什么功能?
      

  12.   

    标志你的对象不同于别的对象的值。好像数据库中的id。
       public int hashcode(){return id;}
      

  13.   

    yingyi(阳光灿烂)
    bigc2001(大C)
    knight_qmh(辉)
    我刚实现了hashCode()方法,试验成功,速度提高了10倍,谢谢