2012-09-17 53 views
1

java.util.BitSet由long []支持,因此最小大小爲64位。我需要緩存大量(〜2M)的對象,每個對象都需要大小爲23的BitSet。是否有替代BitSet的小尺寸更節省空間?例如,是否有一個BitSet類型的數據結構支持byte []而不是long []?這將允許我以3字節而不是8來存儲我的23位。替代java.util.BitSet的小尺寸?

+2

'int'會好嗎?你使用什麼'BitSet'方法? – dasblinkenlight

+0

對於一個明確的建議,我們需要更多地瞭解你正在緩存的對象,以確保這個優化首先是有意義的。如果一個'BitSet'和一個優化的選擇之間的區別只會減少20%的覆蓋面呢? –

回答

6

java.util.BitSet類設計用於更大的位集。當你需要大小爲23的比特集時,即使是基於比特集的ob 3字節也會使用太多的內存,因爲任何大小的數組都會爲該數組本身使用額外的參考,這很可能是四到八個字節。

內存方面最經濟的解決方案是使用int s代替位集,並編寫您自己的所需位集操作實現。由於對位的操作集是從位操作複製在大多數情況下,你應該實現它們沒有問題:

boolean get(int mySet, int index) { 
    return (mySet & (1<<index)) != 0; 
} 
void set(int mySet, int index) { 
    mySet |= (1<<index); 
} 
void clear(int mySet, int index) { 
    mySet &= (1<<index); 
} 

...等等。

+0

+1與位掩碼一起使用int。 –

+1

不要忘記int中的值是通過java傳遞的,所以如果你調用set(..),你傳入的值不會改變。 – thalador

0

首先,長度爲3的字節數組需要多於3個字節。 Java中的任何對象實例都有內存開銷,包括BitSet。

爲了保持低內存消耗,嘗試使用int數組的元素來設置位。這樣的元素不能被表示爲一個對象,所以你必須開發過程接口而不是面向對象。告訴我們你需要什麼樣的操作,我們會提供更詳細的建議。