我正在寻找一种在Java中存储密集可变长度比特阵的非常紧凑的方法。现在,我正在使用BitSet
,但对于大小为 n 的位向量,它似乎平均使用 1.5 * n位的存储空间。通常,这不是问题,但在这种情况下,存储的比特阵列是应用程序的内存占用量非常重要的部分。因此,让它们变小一点真的很有帮助。
BitSet所需的空间似乎是由于用于支持数据结构的long数组在每次扩展以容纳更多位时趋于加倍:
// BitSet's resizing code
private void ensureCapacity(int wordsRequired) {
if (words.length < wordsRequired) {
// Allocate larger of doubled size or required size
int request = Math.max(2 * words.length, wordsRequired);
words = Arrays.copyOf(words, request);
sizeIsSticky = false;
}
}
我可以编写自己的BitSet替代实现,可以更加保守地扩展后端数据结构。但是,如果我不需要,我真的很讨厌复制标准类库中已有的功能。
答案 0 :(得分:20)
如果使用构造函数BitSet
创建BitSet(int nbits)
,则可以指定容量。如果你认为容量错误,并且重新开始,它将会增加一倍。
BitSet
类确实有一个trimToSize
方法,它是私有的,由writeObject和clone()调用。如果您克隆对象或将其序列化,它会将其修剪为正确的长度(假设类通过ensureCapacity方法对其进行了扩展)。
答案 1 :(得分:5)