2013-06-13 41 views
10

當我使用與整數鍵和數據值一個HashMap中機器人我在eclipse得到一個消息:使用SparseIntArray代替HashMap中<整數,整數>使用putSeriazable

Use new SparseIntArray(...) for better performance 

現在的問題是,SparseIntArray()沒有實現Seriazable接口,不能與onRestoreInstanceState()中的.getSerializable()和.putSerializable()一起使用。

1)使用SparseIntArray()而不是HashMap有多重要?

2)我應該經歷讓SparseIntArray可串行化的麻煩嗎? (我的第一個想法是創建一個實現Serializable的包裝類,這是正確的方法嗎?)

回答

24

1)使用SparseIntArray()而不是HashMap有多重要?

這取決於你如何使用它。但是,除非你試圖代表許多和/或這樣的大型「陣列」,否則差異不太可能是顯着的。

請注意,Java SE沒有任何稀疏數組類,它通常不是問題。

2)我應該經歷使SparseIntArray可串行化的麻煩嗎? (我的第一個想法是製作一個實現Serializable的封裝類,這是正確的路要走嗎?)

請參閱上面和下面。 (是的,這聽起來很合理......如果你需要去理會這個。)


SparseIntArray類(source code)使用一對int陣列來表示映射中的鍵和值,和用途二進制搜索來執行查找。密鑰保持按順序排列,沒有「漏洞」,使用二分搜索進行查找。這意味着:

  • 用於SparseIntArray內存使用將大致較少的10因子,對於等效的HashMap。這是由於一個事物的組合:

    • 哈希表數組保存每個條目大致1基準(根據表有多滿...),

    • 的鍵和值必須被「盒裝」如在HashMapInteger對象,並且

    • HashMap每個條目需要一個「節點」對象,它是相當沉重的重量 - 在標準實現4個字段。

    (不過,如果你創建Integer對象正確的方式,「拳」的開銷可以通過Integer類實例高速緩存的影響減輕。)

    相比之下,稀疏的版本需要2 * capacity 4字節字。

  • 查找(即get)是O(logN)O(1)比較HashMap

  • 隨機插入是O(N)O(1)相比較爲HashMap。 (這是因爲插入必須平均移動現有條目的一半,以便可以將新條目添加到陣列中的正確位置。)

  • 順序插入(即按鍵順序升序)是O(1)

所以「哪個最好」顯然取決於你正在優化什麼,你如何使用數據結構,以及它將得到多大。

5

使用HashMap<Integer, Integer>的問題是每個鍵和值都需要裝盒。這種影響從無到有從垃圾產生和/或內存使用(更不用說拳擊/取消裝箱值的輕微性能損失)對系統的沉重負擔。 (這些擔憂也推動了一些第三方的開發collection frameworks for primitives。)

如果您認爲SparseIntArray的好處是值得的,那麼我認爲您的包裝類的方法是合理的。另一種方法是使其實現Parcelable,它也可以用來保存/恢復實例狀態。

+0

感謝您對Ted附加的比較鏈接:+1: – anztrax

相關問題