Java、Android數據結構小節

Java 數據結構

  • Listhtml

    • List 都有序; 線程不安全; 有長度; 內部持有 modCount 記錄修改次數
    • ArrayList 默認長度爲十、超出長度時進行擴容(0.5倍),最大長度 2 的 31 次方 -8, 超出會OOM; 特色: 查快刪改慢
    • LinkedList 雙向鏈表, 鏈表經過內部類 Node 對象實現; 增刪快查找慢, 查詢作了二分(下標前、後半部分)查詢優化
List 承載的實體實現 Comparable、Comparator 接口可讓 List 實現快速排序

Collections.synchronizedList(list); 可使 List 線程安全

new ArrayList(new String[]) 以及 List.toArray() 能夠實現 List、 Array 互轉

Arrays.asList() 返回的 List 是 Arrays 的內部類, 它未提供寫操做, 因此是隻讀的
  • Mapjava

    • Map 共有特性

      無序; 線程不安全;android

    • Hashtablegit

      • 線程安全 (公開方法都加了 synchronized )
      • 不容許 null key 和 null value
      • 默認容量爲 11, 默認負載因子 0.75程序員

        當 size > 容量 * 負載因子 時, 容量會擴容到 2N +1
      • 該類已被淘汰(注意不是廢棄), 若是不須要線程安全可使用 HashMap 代替, 若是須要線程安全可使使用 ConcurrentHashMap
    • HashMapgithub

      • 容許一個 null key 和多個 null value(作了額外處理)
      • 默認容量爲16, 容量 2的N次方; 默認負載因子爲 0.75面試

        手動設置的容量基本會被忽略, 設置的容量若是大於最大容量, 容量會被重設回最大容量
        
        當 size > 容量 * 負載因子 時, 容量會擴容兩倍
      • 更多細節能夠查閱 https://yikun.github.io/2015/... 以及 https://tech.meituan.com/2016...
    • Hashtable 和 HashMap 的對比算法

      HashMap 拋棄了 Hashtable 線程安全特性並通過一系列特定設定使非線程安全場景的 Map 結構數據存取更加高效數組

      • HashMap 線程不安全; Hashtable 線程安全;
      • HashMap 默認容量(16) 和擴容容量都是 2的N次方; Hashtable 的默認容量(11) 和擴容容量(2N + 1). 素數的容量設計能夠減少 key 的 hash碰撞問題, 可是 2的N次方 容量設計能夠更高效的獲取到 key 在哈希桶的位置(Entry數組位置)
      • HashMap 內部對 key 的 hashCode 作了一套新的 hash 運算規則, 讓高位也參與位置計算, 從而減少碰撞機率.
      • HashMap 在發生碰撞後把節點實現改成鏈表, 在節點鏈表長度超過 7 後, 把鏈表改成樹以增長查詢效率
      • https://www.cnblogs.com/xinzh...
    • ConcurrentHashMap安全

      • 線程安全, 多線程優化的 Map 結構實現
      • 不容許 null key 和 null value
      • 其餘特性同 HashMap相似
    • LinkedHashMap

      • HashMap 的子類, 將結構與操做更改成鏈表形式, 能夠保證有序性
      • accessOrder 默認fasle, 表明基於插入順序; 修改成 true 後重寫 removeEldestEntry 方法用來快速實現 lru 算法
    • TreeMap

      • 不容許 null key 但能夠 null value
      • 能夠對元素進行排序, 無序集合(插入順序和便利順序不一致)
Collections.synchronizedMap(map); 可使線 Map 程安全.

Map 的 key 須要具備不可變性而且重寫 equals() 和 hashCode() 方法

HashMap 和 Hashtable 的底層數據結構是一個數組, 結合了順序表和單向鏈表的形式,內部的每個節點都是 Node 對象
  • Set (這部分沒有用心寫)

    線程不安全, 無序且元素不能重複

    底層使用了 map 進行實現(HashMap & LinkedHashMap),借用 map 的 key 不能重複的特性, 來實現不重複性

    HashSet、LinkedHashSet、TreeSet 的區別

    • 都沒法保證線程安全, 底層都使用 map 實現不重複性(因此特性也在 map 中),Set 都不能使用 get(index) 的方法獲取元素, 只能使用 iterator 進行獲取. 其中:

      • HashSet 使用 HashMap, 沒法保證有序性。
      • LinkedHashSet 使用 LinkedHashMap, 能夠保證有序性
      • TreeSet 使用 NavigableMap, 可使用 Comparator 來控制順序
Collections.synchronizedSet(set);可使Set線程安全

Android 數據結構

  • SparseArray、SparseBooleanArray、SparseIntArray、SparseLongArray

    • 內部 key、value 使用數據實現, 使用 int 做爲 key, 對於 Boolean、 Int 以及 Long 的額外處理也免除了 value 的裝箱行爲, 提高性能
    • 內部的數組採用了壓縮方式表示稀疏數組, 節省內存
    • 數據的存取添加了二分查找處理,加快了處理速度
    • 添加數據時使用 append 操做性能優異, 不建議直接使用 put
適用場景爲 key 可使用 int 類型而且數據量在千級之內(二分查找的緣由)
  • LongSparseArray

    使用 long 做爲 key 其餘與 SparseArray 無異; 該類在 androidx.collection 包

  • ArrayMap

    • 內部使用數組實現; 數據存取添加了二分查找處理
    • 推薦在千級如下數據量狀況下使用 ArrayMap 代替 HashMap
  • ArraySet

    同 ArrayMap 是 Android 對 set 的一個實現

關於我

更多Android高級面試合集放在github上面了

須要的小夥伴能夠點擊關於我 聯繫我獲取

很是但願和你們一塊兒交流 , 共同進步

也能夠掃一掃, 目前是一名程序員,不只分享 Android開發相關知識,同時還分享技術人成長曆程,包括我的總結,職場經驗,面試經驗等,但願能讓你少走一點彎路。

相關文章
相關標籤/搜索