java.util.BitSet由long []支持,因此最小大小为64位。我需要缓存大量(~2M)的对象,每个对象都需要一个大小为23的BitSet。对于小尺寸,BitSet是否有更多的空间效率?例如,是否有一个BitSet类型的数据结构,由byte []而不是long []支持?这将允许我以3个字节而不是8个字节存储我的23位。
答案 0 :(得分:8)
java.util.BitSet
类专为更大的位集而设计。当你需要大小为23的位集时,即使是基于ob 3字节的位集也会占用太多内存,因为任何大小的数组都会为数组本身使用额外的引用,这很可能是4到8个字节。
就内存而言,最经济的解决方案是使用int
而不是位集,并编写自己需要的位集操作的实现。由于位集上的操作大部分是从按位操作复制的,因此实现它们应该没有问题:
boolean get(int mySet, int index) {
return (mySet & (1<<index)) != 0;
}
void set(int mySet, int index) {
mySet |= (1<<index);
}
void clear(int mySet, int index) {
mySet &= (1<<index);
}
......等等。
答案 1 :(得分:0)
首先,长度为3的字节数组占用的字节数远远超过3个字节。 Java中的任何对象实例都有内存开销,包括BitSet。
为了保持较低的内存消耗,请尝试使用int数组的元素进行位设置。这样的元素不能表示为对象,因此您必须开发过程接口而不是面向对象。告诉我们您需要对位集进行哪些操作,我们将提供更详细的建议。