前提假设两个list都无重复元素:
public class TwoListDifTest {
public static void main(String[] args) {
List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
l1.add("a");
l1.add("s");
l1.add("f");
l1.add("h");
l1.add("l");
l2.add("a");
l2.add("h");
l2.add("z");
l2.add("x");
getDif1(l1,l2);
getDif2(l1,l2);
getDif3(l1,l2);
}
//1.方法一:两次循环数组+contains()方法:
private static List<String>getDif1(List<String> l1, List<String> l2){
long start = System.currentTimeMillis();
List<String> dif = new ArrayList<>();
for(String str : l1){
if(!l2.contains(str)){
dif.add(str);
}
}
for(String str : l2){
if(!l1.contains(str)){
dif.add(str);
}
}
long end = System.currentTimeMillis();
long t= start-end;
System.out.println(dif);
return dif;
}
//2.方法二:removeAll()+retainAll()方法:
private static List<String>getDif2(List<String> l1, List<String> l2){
long start = System.currentTimeMillis();
List<String> dif = new ArrayList<>();
List<String> res = new ArrayList<>();
dif.addAll(l1);
//先求出两个list的交集;
dif.retainAll(l2);
res.addAll(l1);
res.addAll(l2);
//用合集去掉交集,就是不同的元素;
res.removeAll(dif);
long end = System.currentTimeMillis();
long t= start-end;
System.out.println(res);
return dif;
}
//3.方法三:把数组放进map,key:string,value:次数,最后提取value=1的key;
private static List<String>getDif3(List<String> l1, List<String> l2){
List<String> dif = new ArrayList<>();
Map<String,Integer> map = new HashMap<>();
for (String str: l1){
map.put(str,1);
}
for(String str : l2){
if(map.get(str) != null){
map.put(str,2);
continue;
}else {
map.put(str,1);
}
}
for(Map.Entry<String,Integer> en : map.entrySet()){
if(en.getValue()==1){
dif.add(en.getKey());
}
}
System.out.println(dif);
return dif;
}
}