1. 程式人生 > >各種Set/List集合類的效能總結

各種Set/List集合類的效能總結

  • 各Set實現類的效能分析
HashSet和TreeSet是Set的兩個典型實現,HashSet的效能總是比TreeSet好(特別是最常用的新增、查詢等操作),因為TreeSet需要額外的紅黑樹演算法來維護集合元素的次序。只有當需要一個保持排序的Set時,才應該使用TreeSet,否則都應該使用HashSet. HashSet還有一個子類:LinkedHashSet,對於普通的插入、刪除操作,LinkedHashSet比HashSet要略微慢一點,這是由於維護連結串列所帶來的額外開銷造成的,但由於有了連結串列,遍歷LinkedListSet會更快。 EnumSet是所有Set中效能最好的一個,但它只能儲存同一個列舉類的列舉值作為集合元素。
Set的三個實現類都是執行緒不安全的。如果有多個執行緒同時訪問一個Set集合,並且有超過一個執行緒修改了該Set集合,則必須手動保證該Set集合的同步性。通常可以通過Collections工具類的synchronizedSortedSet方法來“包裝”該Set集合類。
  • 各種線性表的效能分析
Java提供的List就是一個線性表介面,二ArrayList、LinkedList又是線性表的兩種實現:基於陣列的線性表和基於鏈的線性表。Queue代表了佇列,Deque代表了雙端佇列(既可以作為佇列使用,也可以作為棧使用)。 如果需要遍歷List集合元素,對於ArrayLish集合,應該使用隨機訪問的方法(get)來遍歷集合元素,這樣效能更好;對於LinkedList集合,則應該採用迭代器(Iterator)來遍歷集合元素。
如果需要經常執行插入、刪除操作來改變包含大量資料的List集合大小,可以考慮使用LinkedList集合。使用ArrayList集合可能需要經常重新分配內部陣列的大小,效果可能較差。 如果有多個執行緒需要同時訪問List集合中的元素,開發者可考慮使用Collections將集合包裝成執行緒安全的集合。