Java 将布尔标志与每个可能的整数值关联的最快方法是什么?

Java 将布尔标志与每个可能的整数值关联的最快方法是什么?,java,performance,algorithm,data-structures,real-time,Java,Performance,Algorithm,Data Structures,Real Time,如果我有一个字节而不是一个整数,我可以轻松创建一个256个位置的布尔数组并检查: boolean[] allBytes = new boolean[256]; if (allBytes[value & 0xFF] == true) { // ... } 因为我有一个整数,所以不能有一个大小为20亿的数组。检查整数是真是假的最快方法是什么?一组整数?哈希表 EDIT1:我想为每个可能的20亿整数关联一个真或假标志 EDIT2:我有IDX integer,我需要一种快速的方法来知道

如果我有一个字节而不是一个整数,我可以轻松创建一个256个位置的布尔数组并检查:

boolean[] allBytes = new boolean[256];

if (allBytes[value & 0xFF] == true) {
   // ...
}
因为我有一个整数,所以不能有一个大小为20亿的数组。检查整数是真是假的最快方法是什么?一组整数?哈希表

EDIT1:我想为每个可能的20亿整数关联一个真或假标志


EDIT2:我有IDX integer,我需要一种快速的方法来知道IDX是开还是关。

因为您使用的是Java,所以请使用位集。它又快又容易。如果愿意,也可以使用基本long或biginger数组,但这才是位集的真正用途

位集不能处理负数。但有一个简单的方法:

class BigBitSet {
    private final BitSet[] bitSets = new BitSet[] {new BitSet(), new BitSet()};

    public boolean get(int bitIndex) {
        return bitIndex < 0 ? bitSets[1].get(~bitIndex)
                : bitSets[0].get(bitIndex);
    }

    ...
}
第二个位集用于负数,它通过“~”运算符进行转换,这比简单地求反要好,因为它也适用于Integer.MIN_值


内存消耗可能高达4 Gib,即大约524 MB。

我觉得自己连详细说明都很愚蠢

你的电脑能储存的最小信息单位是一点,对吗?一个位有两种状态,您需要两种状态,所以让我们说位=0为假,位=1为真

所以你需要尽可能多的整数位,2^32=4294967296。一个字节可以容纳8位,因此只需要2^32/8=536870912字节

从这一点很容易遵循的代码,以解决这些字节中的每一位

 byte[] store = new byte[1 << 29]; // 2^29 bytes provide 2^32 bits

 void setBit(int i) {
     int byteIndex = i >>> 3;
     int bitMask = 1 << (i & 7);
     store[byteIndex] |= bitMask;
 }

 boolean testBit(int i) {
     int byteIndex = i >>> 3;
     int bitMask = 1 << (i & 7);
     return (store[byteIndex] & bitMask) != 0;
 }

java.util.BitSet在一个好的类中提供了几乎相同的premade,只有您可以使用它来存储最多2^31位,因为它不适用于负位索引。

为什么要这样做?这似乎有点过分了。也许可以告诉我们您为什么要这样做,我们可以建议您寻找一种更有效的解决方案位集。@DwB这是20亿。这会毁了你的记忆!20亿字节是2GB。现在大多数计算机都能处理这些问题。如果你改用一个位集,它将变成20亿位,这是一个微不足道的250MB,你当然可以处理。不管是什么解决方案,这听起来就像一个XY问题……你能给出一个代码示例来说明如何使用位集做到这一点吗?例如:如何打开和关闭整数-23434?@chrisapotek您需要两个。请看我的答案。@chrisapotek martinus是对的-一个位集用于非负片,一个位集用于负片。看起来一个位集需要大量预分配的内存5亿字节,对吗?那么我可能必须坚持使用哈希表。你觉得怎么样?@chrisapotek在你回答其他评论中问过的一些问题之前,没有人能回答你,比如说,这个集合有多稀疏,它是什么,因为可能有更好的解决方案。另外,一些答案是出于未知原因,考虑到负整数-请澄清预期的确切范围。