1、問題java
如今有兩個ArrayList列表,列表中的元素是String字符串。比較這兩個列表中的內容相等(能夠順序不一致)。如:3d
List<String> lsit1 = new ArrayList<>(); List<String> lsit2 = new ArrayList<>(); list1.add("1"); list1.add("1"); list1.add("3"); list1.add("2"); list2.add("1"); list2.add("3"); list2.add("2"); list2.add("2");
先貼上最終解決的代碼:code
public booelan equalsList(List<String> list1, List<String> list2){ // null狀況 if ( (list1 == null && list2 != null) || (list1 != null && list2 == null) ) { return false; } // 大小比較 if (list1.size() != list2.size) { return false; } String[] arr1 = list1.toArray(new String[]{}); String[] arr2 = list2.toArray(new String[]{}); Arrays.sort(arr1); Arrays.sort(arr1); return Arrays.equals(arr1,arr2); }
2、解決過程對象
首先能夠想到的是,先null狀況和兩個列表size的比較。blog
// null狀況 if (list1 == null) { return list2 == null; } // 大小比較 if (list1.size() != list2.size) { return false; }
大小和Null的狀況已經判斷完了。如今的兩個列表一定是兩個不爲空且大小相等的列表。也就是說,如今只要比較內容是否都相同(忽略順序)就能夠了。有人認爲能夠用contains 或者 containsAll來解決,如:排序
for (String str : list1) { if (!list2.contains(str)) { return false; } } return true;
或者接口
if (lsit1.containsAll(list2) && list2.containsAll(list1)) { return true; } return false;
可是使用這二者方法都是用問題的,由於ArrayList中的元素可重複的。因此若是list1中爲{"1","1","3","2"},list2中爲{"1","3","2","2"},這個時候上面兩種辦法結果都會爲true,顯示這兩個列表是不相同的。由於containsAll()中仍是調用了contains方法。字符串
使用contains和containsAll更適合與去重後的列表進行比較。可是這裏的比較是不去重且無序的,因此不能用這個辦法。hash
說到無序,大概就可能知道該怎麼解決了。既然是無序的,那就把這兩個list的內容排序再逐個的進行比較不就能夠了?因此,Arrys.sort(),Arrays,equals(),就排上了用場。it
String[] arr1 = list1.toArray(new String[]{}); String[] arr2 = list2.toArray(new String[]{}); Arrays.sort(arr1); Arrays.sort(arr1); return Arrays.equals(arr1,arr2); //這裏能夠本身遍歷,可是明顯使用Arrays.equals()方法更加的方便。
3、注意事項
可是須要注意的是,使用Arrys.sort(),Arrays,equals(),List中存放的對象必須實現了Comparable接口並重寫了compareTo()方法和equals()方法。由於Arrays.sort()和Arrays.equals()會調用類的compareTo方法和equals()方法。
上面的例子使用的是String類型,String類型中已經實現了Comparable接口並重寫了compareTo()方法和equals()方法以及hashCode()方法。
若是List中存放的類沒有實現comparable接口,在使用Arrays.sort()是會拋出異常 java.lang.ClassCastException: XXX cannot be cast to java.lang.Comparable。
若是隻實現了Comparable接口並重寫了compareTo()方法,可是沒有重寫equals()和hashCode()方法。會致使結果一直爲false,覺得他比較的是兩個對象的地址。因此在使用list比較時最好使用String 這種已經實現了Comparable接口的並已經重寫了compareTo()、equals()、hashCode()方法的類比較方便。