SparseArray與HashMap相比優缺點

  SparseArray(稀疏數組).他是Android內部特有的api,標準的jdk是沒有這個類的.在Android內部用來替代HashMap<Integer,E>這種形式,使用SparseArray更加節省內存空間的使用,SparseArray也是以key和value對數據進行保存的.使用的時候只需要指定value的類型即可.並且key不需要封裝成對象類型.

    很多人都會誤認爲SparseArray要比HashMap的插入和查找的效率要快,還有人則是認爲Hash查找當然要比SparseArray中的二分查找要快得多.

   查找:對一個數據或者是幾個數據的查詢.二者的差異還是非常小的.當數據量是100000條.查100000條的效率還是Map要快一點.數據量爲10000的時候.這就差異性就更小.但是Map的查找的效率確實還是贏了一籌.

  正序插入:SparseArray在正序插入的時候,效率要比HashMap要快得多,並且還節省了一部分內存。

  倒敘插入:,SparseArray與HashMap無論是怎樣進行插入,數據量相同時,前者都要比後者要省下一部分內存,但是效率呢?在倒序插入的時候,SparseArray的插入時間和HashMap的插入時間遠遠不是一個數量級.由於SparseArray每次在插入的時候都要使用二分查找判斷是否有相同的值被插入.因此這種倒序的情況是SparseArray效率最差的時候.

  SparseArray每次的插入方式都需要調用二分查找.因此這樣在倒序插入的時候會導致情況非常的糟糕,效率上絕對輸給了HashMap學過數據結構的大家都知道.Map在插入的時候會對衝突因子做出相應的決策.有非常好的處理衝突的方式.不需要遍歷每一個值.因此無論是倒序還是正序插入的效率取決於處理衝突的方式,因此插入時犧牲的時間基本是相同的

   在保存<Integer,E>時使用SparseArray去替換HashMap的主要原因還是因爲內存的關係.保存的數據量無論是大還是小,Map所佔用的內存始終是大於SparseArray的.數據量100000條時SparseArray要比HashMap要節約27%的內存.也就是以犧牲效率的代價去節約內存空間.我們知道Android對內存的使用是極爲苛刻的.堆區允許使用的最大內存僅僅16M.很容易出現OOM現象的發生.因此在Android中內存的使用是非常的重要的.因此官方纔推薦去使用SparseArray<E>去替換HashMap<Integer,E>.官方也確實聲明這種差異性不會超過50%.所以犧牲了部分效率換來內存其實在Android中也算是一種很好的選擇吧.

總結Android中在保存<Integer,Value>的時候推薦使用SparseArray的本質目的不是由於效率的原因,而是內存的原因.我們確實看到了在正序插入的時候SparseArray要比HashMap要快,倒敘插入效率遠遠不如HashMap。在查找時效率不如HashMap。但是不管插入還是查詢,SparseArray都會節省內存。可以理解爲以時間換取空間。


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