《瘋狂的JAVA講義》筆記-第8章集合

《瘋狂的JAVA講義》筆記-第8章集合

  • IteratorListIterator接口

    • Iterator迭代時是將元素的值返回,並不是將元素本身返回,所以迭代時無法更改元素的值。但是可以刪除
    • ListIterator 則擁有增刪改查以及向前迭代的功能
  • HashSet HashMap

    • 通過Hash算法來確保key 或者元素不能重複的類,一般不要進行更改。因爲更改了內容可能會導致錯誤,如 equals() 返回相等以及hashCode()相同, 取出或刪除的時候無法定位。
    • 如果兩個元素 hashCode() 相等但是 equals() 返回 false 則需要在一個“桶”裏裝多個元素,會導致性能的下降。聽說JDK8通過紅黑樹解決了這個麻煩
  • LinkedHashSetTreeSet

    • LinkedHashSet在使用hasCode() 定位元素的同時,使用鏈表來維護集合順序(以插入順序爲序),所以迭代遍歷很快,插入稍慢,可滿足要求有一定順序的集合需求
    • TreeSet也是有序的,但是是按元素的實際值大小進行排序。
  • EnumSet

    • 佔用內存小 ,性能好
    • 要求同一個 EnumSet 裏都是統一的枚舉類。
  • ArrayList

    • 變長的數組,自動擴容
    • 最好在添加大量數據前,使用ensureCapacity(int minCapacity) 方法來避免多次重分配內存。initCapacity = 10
  • Map性能

    • 儘量不要用 TreeMap ,如果要用,可通過使用 LinkedHashMap 並確保插入key-value對時有序即可
    • 一般情況下,使用 HashMap,小範圍內可以使用EnumMap,要嚴格使用==的可以使用 IdentityHashMap,內存吃緊的時候可以使用 WeakHashMap

    如何保證 HashMap不因擴容而浪費性能,可參照如何保證HashMap不重建Hash表

  • Collecitons 工具類

    • 返回不可變類的三個方法
      • emptyXxx() : 返回一個空的Xxx對象
      • SingletonXxx(Xxx) : 返回只有一個對象的不可變對象
      • unmodifiable(xxx) : 返回對象的不可變對象
  • 綜合

    • 線程不安全的集合,可以通過Xxx x = Collections.synchronizedXxx(new Xxx())List l = Collections.synchronizedList(new ArrayList())來獲取線程安全的集合,當然性能會降低。
    • 如果要使用集合,則推薦使用HashSet,除非需要根據 元素實際值進行排序才使用 TreeSet
  • 各種集合的性能對比

    • 底層使用數組爲實現的,隨機訪問性能最好。底層使用鏈表爲實現的,插入刪除性能最佳。
    • 迭代則使用鏈表更快
    • 應用場景
      • 當遍歷時,LinkedList使用迭代器,其他使用隨機訪問的方式
      • 如果經常需要插入刪除,則使用 LinkedList ;如果
        性能對比

END

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