集合初始化一般進行分配容量,設置特定參數等相關工做,推薦在任何狀況下,都須要顯式地設定集合容量的初始大小。java
ArrayList 使用無參構造時,默認大小爲 10 ,也就是說在第一次add的時候,分配爲10的容量,後續的每次擴容都會調用Array.copyOf 方法,建立新數組現複製。能夠想像,假如須要將1000個元素放置在ArrayList中採用默認構造器方法,則須要被動擴容13次才能夠完成存儲。反之,若是在初始化進便指定了容量,newArrayList(1000) ,那麼初始化ArrayList 對像的時候就直接分配1000個存儲空間,從而避免被動擴容和數組複製的額外開銷。數組
HashMap 使用無參構造時,默認大小爲16,若是要放置1000個元素,須要被動擴容7次才能夠完成存儲。擴容時須要重建hash表,很是影響性能。HashMap容量並不會在new的時候分配,而是在第一次put的時候完成建立。網絡
泛型性能
List List<Object> List<?> List<? extends T> List<? super T>code
List: 徹底沒有 類型的限制和賦值的限定對象
List<Object> 是一個泛型,只能賦值Object泛型接口
List<Integer> integerList = new ArrayList<>(); List<Object> objectList = integerList; //編譯不經過
List<?> 是一個泛型,能夠接受任何類型的集合賦值(不是添加元素),賦值以後就不能隨便住裏添加元素了。它通常做爲參數來接收外部的集合,或者返回一個不知道具體類型的集合rem
List<?> list = new ArrayList<Integer>(); list.add(1); //編譯不能經過
List<? extend T> 能夠賦值給任何T及T子類的集合,上界爲T 。取出來的類型帶有泛型限制,向上強制轉型爲T,即只能返回T和T的父類。 除了null外,任何元素都不得添加進集合內(沒法使用add 方法) ,add 受限get
List<? super T> 能夠賦值給任何T及T父類集合,下界爲T。能夠添加T及T的子類元素,但返回時的元素類型只能是Object,泛型丟失。 get功能受限hash
總結:若是集合屬於 get first 應採用<? extend T> ,add first 應採用<? super T>
其餘
1.Arrays.asList() 轉成集合時,是不能進行add/remove/clear 的,會拋出unsuppotedOperationExecption異常
2.list.toArray() 建議不要使用無參調用,將泛型丟失 。
3.list.toArray(array) 參數中數組的大小要與集合類型同樣,若是數組長度小於集合元素個數,將複製失敗所有輸出Null。若是數組的大小與與元素的大小不同還會下降性能
4.對象若是覆寫了equal 也要複寫hashCode
5.使用ArrayList.subList 方法生成子列表,若是主列表集合的個數增長或刪除,會致使子列表的遍歷,增長,刪除失敗,拋出ConcurrrentModificationException。而且子列表是無沒有 實現序列化接口沒法在網絡中傳輸。
摘自- 《碼出高效》