java.util.BitSet是由long[]支持的,所以最小尺寸是64位。我需要缓存很多(约2M)对象,每个对象都需要一个23位的BitSet。有没有一种比BitSet更节省空间的小尺寸的替代方法?例如,有没有一种BitSet类型的数据结构是由字节[]而不是长[]来支持的?这将允许我把23位存储在3个字节中,而不是8个。
该 java.util.BitSet
类是为更大的位集而设计的,当你需要大小为23的位集时,即使是基于ob 3字节的位集也会占用太多内存,因为任何大小的数组都会为数组本身使用额外的引用,这很可能是4-8个字节。当你需要大小为23的位集时,即使是基于3字节的位集也会使用过多的内存,因为任何大小的数组都会为数组本身使用一个额外的引用,这很可能是4到8个字节。
就内存而言,最经济的解决方案是使用 int
而不是位集,并编写你自己所需要的位集操作的实现。由于对位集的操作大部分是从位智操作中复制过来的,所以你实现它们应该没有问题。
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);
}
...以此类推
首先,长度为3的字节数组需要的内存远远超过3个字节。Java中的任何对象实例都有内存开销,包括BitSet。
为了降低内存消耗,尽量使用int数组中的元素来表示BitSet。这种元素不能用对象来表示,所以你必须开发过程接口,而不是面向对象。告诉我们你需要对位集进行哪些操作,我们会做出更详细的建议。