我的算法使用了大量的boolean
,正如我所教導的,每個布爾變量需要1個字節。無論如何要聲明一個布爾數組並減少內存使用量,因爲我正在使用電話環境。是否有可能在Java中聲明一個1位變量?
編輯:我和我的朋友正在討論如果BitSet比正常布爾數組慢。請澄清這一點。該算法仍然需要滿足最佳需求的性能。
我的算法使用了大量的boolean
,正如我所教導的,每個布爾變量需要1個字節。無論如何要聲明一個布爾數組並減少內存使用量,因爲我正在使用電話環境。是否有可能在Java中聲明一個1位變量?
編輯:我和我的朋友正在討論如果BitSet比正常布爾數組慢。請澄清這一點。該算法仍然需要滿足最佳需求的性能。
此類實現按需增長的位向量。該位組的每個 組件都有一個布爾值。 BitSet的位是由非負整數索引的 。個別索引位可以是 檢查,設置或清除。一個BitSet可用於通過邏輯AND,邏輯與或, 和邏輯異或操作來修改另一個BitSet的內容 。
Link to benchmark使用boolean
與BitSet
謝謝。但請回答我在EDIT中添加的問題。 – 2012-01-13 13:29:20
可以使用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是如果合適的更加清晰。
[java.util.BitSet](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)?或者我錯過了什麼? – Mysticial 2012-01-13 05:19:25
Geez ...我應該停止猶豫併發布這些答案... – Mysticial 2012-01-13 05:22:24
@Mysticial:在猶豫中稍微猶豫一下。 ;) – Mehrdad 2012-01-13 05:23:44