1、實現了compareTo方法,就有必要實現equals方法,同時還需要確保兩個方法同步
compareTo是判斷元素在排序中的位置是否相等,equals是判斷元素是否相等,既然一個決定排序位置,一個決定相等,所以我們非常有必要確保當排序位置相同時,其equals也應該相等。
2、subList返回的只是原列表的一個視圖,它所有的操作最終都會作用在原列表上
如:從list中刪除部分數據:list.subList(100, 200).clear();
3、在使用asList時不要將基本數據類型當做參數,應使用其包裝類
如:int[] intA = {1,2,3,4,5};
List list = Arrays.asList(intA);--------返回的list的size是1,內部item第一個元素是int[] intA的數組值;
使用包裝類時:
因爲:asList的源碼
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);//該ArrayList是Arrays的一個內部類,不是java.util.ArrayList
}
該方法的接受參數是變長泛型T的,8種基本數據類型是無法髮型化,所以在將int[] intA數組對象作爲一個泛型T的方法入參;
4、不要試圖改變(dd、remove等)asList返回的列表結構,否則會直接拋出UnsupportedOperationException異常
在第3點說到,Arrays.asList(T... a)的源碼,返回的該ArrayList是Arrays的一個內部類java.util.Arrays.ArrayList,不是java.util.ArrayList。該內部類提供了size、toArray、get、set、indexOf、contains方法,而像add、remove等改變list結構的方法從AbstractList父類繼承過來,它會直接拋出UnsupportedOperationException異常:
內部類java.util.Arrays.ArrayList支持的方法有:
其他操作結構的方法(add、remove等),來自java.util.AbstractList的實現:
如果非要操作,可以使用 java.util.ArrayList包一層:new java.util.ArrayList(將asList的java.util.Arrays.ArrayList)
5、如果知道集合容器的大小,要爲集合指定初始容量,優化性能
如:ArrayList:動態擴容時,新容量=舊容量的1.5倍,使用System.copy方法完成數組拷貝;
HashMap:動態擴容時(達到閾值),新容量=舊容量的2倍,新閾值=舊閾值的2倍,新建節點數組,完成拷貝;