java.util.BitSet 由 long[] 支持,因此最小大小为 64 位。我需要缓存大量(~2M)对象,每个对象都需要一个大小为 23 的 BitSet。是否有替代 BitSet 的替代方案,对于小尺寸来说更节省空间?例如,是否存在由 byte[] 而不是 long[] 支持的 BitSet 类型数据结构?这将允许我将我的 23 位存储在 3 个字节而不是 8 个字节中。
问问题
1007 次
2 回答
9
该类java.util.BitSet
专为较大的位组而设计。当您需要大小为 23 的位集时,即使是基于 ob 3 字节的位集也会使用太多内存,因为任何大小的数组都会使用数组本身的附加引用,这很可能是 4 到 8 个字节。
就内存而言,最经济的解决方案是使用int
s 而不是位集,并编写您自己的所需位集操作的实现。由于对位集的操作大部分是从按位操作复制而来的,因此实现它们应该没有问题:
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 回答