小尺寸的java.util.BitSet的替代品?

问题描述 投票:1回答:2

java.util.BitSet是由long[]支持的,所以最小尺寸是64位。我需要缓存很多(约2M)对象,每个对象都需要一个23位的BitSet。有没有一种比BitSet更节省空间的小尺寸的替代方法?例如,有没有一种BitSet类型的数据结构是由字节[]而不是长[]来支持的?这将允许我把23位存储在3个字节中,而不是8个。

java collections bitset
2个回答
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);
}

...以此类推


0
投票

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

为了降低内存消耗,尽量使用int数组中的元素来表示BitSet。这种元素不能用对象来表示,所以你必须开发过程接口,而不是面向对象。告诉我们你需要对位集进行哪些操作,我们会做出更详细的建议。

© www.soinside.com 2019 - 2024. All rights reserved.