Java集合的5點細節

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倍,新建節點數組,完成拷貝;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章