我正在寻求一种非常紧凑的方式来在Java中存储一个密集的可变长度位数组。目前,我正在使用BitSet
,但它似乎平均使用了1.5*n位的存储空间来存储大小为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 的另一种实现。