天天看點

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

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

  • Iterator

    ListIterator

    接口
    • Iterator

      疊代時是将元素的值傳回,并不是将元素本身傳回,是以疊代時無法更改元素的值。但是可以删除
    • ListIterator

      則擁有增删改查以及向前疊代的功能
  • HashSet

    HashMap

    • 通過Hash算法來確定key 或者元素不能重複的類,一般不要進行更改。因為更改了内容可能會導緻錯誤,如

      equals()

      傳回相等以及

      hashCode()

      相同, 取出或删除的時候無法定位。
    • 如果兩個元素

      hashCode()

      相等但是

      equals()

      傳回

      false

      則需要在一個“桶”裡裝多個元素,會導緻性能的下降。聽說JDK8通過紅黑樹解決了這個麻煩
  • LinkedHashSet

    TreeSet

    • 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

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

END

繼續閱讀