Java中非常紧凑的位数组

Java中非常紧凑的位数组,java,memory,bit-manipulation,bitset,bitarray,Java,Memory,Bit Manipulation,Bitset,Bitarray,我正在寻找一种在Java中存储密集可变长度位数组的非常紧凑的方法。现在,我使用的是位集,但对于大小为n的位向量,它似乎平均使用了1.5*n位的存储空间。通常,这不是问题,但在本例中,存储的位数组是应用程序内存占用的重要部分。所以,让它们变小一点真的很有帮助 位集所需的空间似乎是由于这样一个事实,即用于支持数据结构的long数组在每次扩展以容纳更多位时往往会翻一番: // BitSet's resizing code private void ensureCapacity(int wordsReq

我正在寻找一种在Java中存储密集可变长度位数组的非常紧凑的方法。现在,我使用的是
位集
,但对于大小为n的位向量,它似乎平均使用了1.5*n位的存储空间。通常,这不是问题,但在本例中,存储的位数组是应用程序内存占用的重要部分。所以,让它们变小一点真的很有帮助

位集所需的空间似乎是由于这样一个事实,即用于支持数据结构的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;
  }
}
//位集的大小调整代码
私人无效担保资产(需要输入字数){
如果(字数.长度<所需字数){
//分配两倍大小或所需大小中的较大者
int request=Math.max(2*words.length,words required);
words=Arrays.copyOf(words,request);
sizeistick=false;
}
}

我可以编写自己的比特集替代实现,以更保守地扩展后端数据结构。但是,如果没有必要,我真的不想复制标准类库中已有的功能

如果使用构造函数
位集(int-nbits)
创建
位集
,则可以指定容量。如果你猜错了容量,再看一遍,它的大小会翻倍


BitSet
类确实有一个
trimToSize
方法,该方法是私有的,由writeObject和clone()调用。如果克隆或序列化对象,它会将其修剪到正确的长度(假设类通过ensureCapacity方法对其进行了过度扩展)。

您可能会受益于压缩位集替代方案。例如,见:


我很难想象这会出现在标准Java库中。这不是它真正的设计目的。我打赌你可以找到一个第三方库。我想在你的情况下,定制实现会是一个更好的选择。是的。注意,您实际上不需要使用复制的版本。原作是经过修剪的,真聪明。谢谢至少在on GrepCode中,如果指定了初始大小,并且阵列不需要增长,则不会修剪原始阵列。