HashSet hs = new HashSet(list1); hs.addAll(list2);
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好象是最快的。
List result=new ArrayList(list1);
list1.retainAll(list2);
result.removeAll(list1);
result.addAll(list2);
for(int i=0;i<list2.size();i++){
if(!list1.contains(list2.get(i))){
list1.add(list2.get(i));
}
}
无序的话效率不会高,有序的话可以用归并排序。无序的话,对两个ArrayList使用快速排序,然后再用归并排序应该也比现在的效果好,因为现在的代码相当于2个循环的嵌套。
hs.addAll(list2);
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好象是最快的。
retainAll 方法是不是相当于两个list取了交集,那样的话就错了吧
应该是两个list去减集
bigc2001(大C)
你们的方法我刚试过了,基本上没有变化,不过还是谢谢
你的方法为什么无法避免重复?
只是把两个list单纯的合并了,hashset好像没能实现唯一性
hashcode()是什么功能?
public int hashcode(){return id;}
bigc2001(大C)
knight_qmh(辉)
我刚实现了hashCode()方法,试验成功,速度提高了10倍,谢谢