2012-01-13 150 views
6

我的算法使用了大量的boolean,正如我所教導的,每個布爾變量需要1個字節。無論如何要聲明一個布爾數組並減少內存使用量,因爲我正在使用電話環境。是否有可能在Java中聲明一個1位變量?

編輯:我和我的朋友正在討論如果BitSet比正常布爾數組慢。請澄清這一點。該算法仍然需要滿足最佳需求的性能。

+12

[java.util.BitSet](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)?或者我錯過了什麼? – Mysticial 2012-01-13 05:19:25

+2

Geez ...我應該停止猶豫併發布這些答案... – Mysticial 2012-01-13 05:22:24

+2

@Mysticial:在猶豫中稍微猶豫一下。 ;) – Mehrdad 2012-01-13 05:23:44

回答

18

BitSet

此類實現按需增長的位向量。該位組的每個 組件都有一個布爾值。 BitSet的位是由非負整數索引的 。個別索引位可以是 檢查,設置或清除。一個BitSet可用於通過邏輯AND,邏輯與或, 和邏輯異或操作來修改另一個BitSet的內容 。

Link to benchmark使用booleanBitSet

+0

謝謝。但請回答我在EDIT中添加的問題。 – 2012-01-13 13:29:20

1

可以使用EnumSet以及之間。這允許您使用命名位,並且可以比使用索引位的BitSet更友好。

專門用於枚舉類型的Set實現。枚舉集合中的所有元素必須來自單個枚舉類型,該集合類型在創建集合時顯式或隱式指定。枚舉集在內部表示爲位向量。這種表示非常緊湊和高效。這個類的空間和時間性能應該足夠好,可以用作傳統的基於int的「比特標誌」的高質量,類型安全的替代品。即使批量操作(如containsAll和retainAll)也應該運行得非常快,如果它們的參數也是一個枚舉集合。

例如

BitSet bs = new BitSet(4); 
bs.set(1); // READY 
bs.set(3); // LARGE_FLAG 
boolean largeFlag = bs.get(1); // LARGE_FLAG 
System.out.println("Using BitSet: "+bs); 

EnumSet<Settings> settings = EnumSet.noneOf(Settings.class); 
settings.add(Settings.READY); 
settings.add(Settings.LARGE_FLAG); 
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG); 
System.out.println("Using EnumSet: "+settings); 

打印

Using BitSet: {1, 3} 
Using EnumSet: [READY, LARGE_FLAG] 

恕我直言,EnumSet是如果合適的更加清晰。

相關問題