需要长Java位列表

时间:2012-08-22 18:59:13

标签: java arrays boolean

在Java中,我有一个数百万左右的数组标记为true / false,以便存储。 BitSet应该有帮助吗?虽然它实现了Set,但是可以像它是一个数组boolean[]一样快速迭代它的元素吗?

很抱歉,如果有人问这个问题。首先,我尝试将数组拆分为二进制表示的int的块,并由于这些二进制文件而形成int[],因此我可以将大小减小32,但这是非常低级的。

我在其他地方找到了BitSet的一些评论家,boolean[]存储了大量额外的内存=>对大型阵列不利。

最好存储一百万个旗帜?

5 个答案:

答案 0 :(得分:3)

  

我有一个百万左右的数组标记true / false来记住。 BitSet应该有帮助吗?

你可以在BitSet中拥有数十亿比特。

  

虽然它实现了一个Set,但它是否可以像它是一个数组boolean []一样快速迭代它的元素?

boolean []每位使用一个字节(在大多数JVM上),而BitSet每位使用一位。对于小数组,boolean []更快,但是当您测试CPU缓存的大小时,BitSet可以更有效。

BTW:对于小尺寸,使用BitSet稍微慢一点,因为它需要从每个内存字中提取出一点。 byte[]有同样的问题,所以如果你想自己设置一下,我建议你像BitSet一样使用int[]


使用BitSet的示例

BitSet bitSet = new BitSet();
// set bit 100
bitSet.set(100);
// get bit 99
System.out.println("bit 99 is " + bitSet.get(99));
System.out.println("bit 100 is " + bitSet.get(100) + " after set");
bitSet.clear(100);
System.out.println("bit 100 is " + bitSet.get(100) + " after clear");

打印

bit 99 is false
bit 100 is true after set
bit 100 is false after clear

答案 1 :(得分:1)

我只使用一个简单的boolean[]。 另外,请注意BitSet未实现Set接口。

public class BitSet implements Cloneable, java.io.Serializable

答案 2 :(得分:1)

只是一个想法,如何使用像HashSet这样的东西并添加“on”标志的索引,当它们“关闭”时删除它们。

(如果您的大多数标志在任何给定时间都关闭,这将特别有效。)

答案 3 :(得分:0)

来自http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • boolean:布尔数据类型只有两个可能的值:true和 假。将此数据类型用于跟踪true / false的简单标志 条件。此数据类型代表一位信息,但它的信息 “尺寸”不是精确定义的东西。

如果您担心大小和可预测性,那么我会尝试将8位块表示为字节,然后存储在byte []中。

答案 4 :(得分:0)

BitSet操作非常有效,您可以自己检查the sources。它没有实现Set,但您可以在一个简单的循环中有效地迭代各个位,例如:

int l = bitSet.length();
for(int i = 0; i < l; i++) {
    boolean bit = bitSet.get(i);
    // ...
}

(你找到了什么批评'BitSet1?请在你的问题中加入链接供其他人查看。)


如果您需要管理一组特定的固定布尔标志,则可以在enum中列出它们,然后使用EnumSet表示标记设置。对它们的操作也非常有效地实施。引用文档:

  

这个类的空间和时间性能应该足以使其成为传统的基于int的“位标志”的高质量,类型安全的替代品。即使批量操作(例如containsAll和retainAll)如果它们的参数也是枚举集也应该非常快速地运行。

作为与BitSet相比的额外好处,此表示为type-safe,可以为您节省很多麻烦。