2

java.util.BitSet 由 long[] 支持,因此最小大小为 64 位。我需要缓存大量(~2M)对象,每个对象都需要一个大小为 23 的 BitSet。是否有替代 BitSet 的替代方案,对于小尺寸来说更节省空间?例如,是否存在由 byte[] 而不是 long[] 支持的 BitSet 类型数据结构?这将允许我将我的 23 位存储在 3 个字节而不是 8 个字节中。

4

2 回答 2

9

该类java.util.BitSet专为较大的位组而设计。当您需要大小为 23 的位集时,即使是基于 ob 3 字节的位集也会使用太多内存,因为任何大小的数组都会使用数组本身的附加引用,这很可能是 4 到 8 个字节。

就内存而言,最经济的解决方案是使用ints 而不是位集,并编写您自己的所需位集操作的实现。由于对位集的操作大部分是从按位操作复制而来的,因此实现它们应该没有问题:

boolean get(int mySet, int index) {
    return (mySet & (1<<index)) != 0;
}
int set(int mySet, int index) {
    return mySet | (1<<index);
}
int clear(int mySet, int index) {
    return mySet & (1<<index);
}

...等等。

于 2012-09-17T09:40:57.730 回答
0

首先,长度为 3 的字节数组占用的字节数远多于 3 个字节。Java 中的任何对象实例都有内存开销,包括 BitSet。

为了保持低内存消耗,请尝试使用 int 数组的元素进行位设置。这样的元素不能表示为对象,因此您必须开发过程接口而不是面向对象。告诉我们您需要对位集进行哪些操作,我们将提供更详细的建议。

于 2012-09-17T09:41:45.463 回答