瞭解了Java記憶體相關的內容後,現在來簡單介紹下Java的集合。 Set:不含有重覆數據的集合。常用的對象HashSet,TreeSet,LinkedHashSet。HashSet擁有很好的性能,其數據是無序的。TreeSet的結構為紅黑樹,所以其數據是有序的,但不允許含有null。LinkedHa ...
瞭解了Java記憶體相關的內容後,現在來簡單介紹下Java的集合。
Set:不含有重覆數據的集合。常用的對象HashSet,TreeSet,LinkedHashSet。HashSet擁有很好的性能,其數據是無序的。TreeSet的結構為紅黑樹,所以其數據是有序的,但不允許含有null。LinkedHashSet保持數據的插入順序。
List:Java中常用的集合。常用的對象ArrayList,LinkedList,Vector。ArrayList多用於容量已知、隨機讀較多的場景。LinkedList多用於未知容量,隨機寫較多的場景。Vector是線程安全的。
Queue:多用於對數據進行FIFO(先進先出)隊列的管理。常用的對象SynchronousQueue,LinkedBlockingQueue,DelayQueue。 SynchronousQueue是一個無容量的阻塞隊列,每個插入操作必須等待其他線程的remove操作,反之亦然,它適合於handoff designs。DelayQueue一個元素在延遲一定時間後才被取出的阻塞隊列。LinkedBlockingQueue常用的阻塞隊列。
Deque:用於對數據進行FIFO(先進先出),LIFO(後進先出)雙隊列的管理。
Map:Java常用key/value數據結構。常用的對象ConcurrentHashMap, HashMap, Hashtable, LinkedHashMap, TreeMap。Hashtable可以說已被替換。ConcurrentHashMap用於線程安全的場景。LinkedHashMap保留了數據的插入順序。TreeMap的key是有序的。
使用集合的經驗:
- 容量確定時,一定初始化好起容量,這樣可以避免集合的自動擴容。
- 註意集合的上限,一個是java本身int類型的限制,一個是jvm記憶體的限制。
- 集合線程安全針對的是集合結構變化時(add,delete,remove,put,resize操作),操作結果要符合預期。
- Jdk 1.8已經支持collection集合的聚集和並行操作(Aggregate Operations and Parallel).類似spark的RDD.這塊很有意思,建議大家去看看。
關於集合的自動擴容演算法等源碼,網上以比比皆是,So,露巧不如藏拙。