Java:有效存储布尔值[32]?

Java:有效存储布尔值[32]?,java,performance,Java,Performance,在Java中,我希望将长度为32的布尔值(boolean[])数组(>10000)存储到磁盘中,稍后再读取它们以进行进一步的计算和比较 由于单个数组的长度为32,我想知道将其存储为整数值以加快读写速度(在32位机器上)是否有意义。您是否建议使用位集,然后转换为int?或者甚至忘记int而使用字节?对于二进制存储,使用int和DataOutputStream(DataInputStream读取) 我认为布尔数组在java中是以字节或int数组的形式存储的,所以你可能想考虑避免开销,并且一直保持in

在Java中,我希望将长度为32的布尔值(boolean[])数组(>10000)存储到磁盘中,稍后再读取它们以进行进一步的计算和比较


由于单个数组的长度为32,我想知道将其存储为整数值以加快读写速度(在32位机器上)是否有意义。您是否建议使用位集,然后转换为int?或者甚至忘记int而使用字节?

对于二进制存储,使用
int
DataOutputStream
DataInputStream
读取)

我认为布尔数组在java中是以字节或int数组的形式存储的,所以你可能想考虑避免开销,并且一直保持int编码,即根本不使用布尔[]。阿纳尔。p> 取而代之的是,吃点类似的东西

public class BooleanArray32 {
  private int values;

  public boolean get(int pos) {
    return (values & (1 << pos)) != 0;
  }

  public void set(int pos, boolean value) {
     int mask = 1 << pos;
     values = (values & ~mask) | (value ? mask : 0);
  }

  public void write(DataOutputStream dos) throws IOException {
    dos.writeInt(values);
  }

  public void read(DataInputStream dis) throws IOException {
    values = dis.readInt();
  }

  public int compare(BooleanArray32 b2) {
     return countBits(b2.values & values);
  }

  // From http://graphics.stanford.edu/~seander/bithacks.html
  // Disclaimer: I did not fully double check whether this works for Java's signed ints
  public static int countBits(int v) {
    v = v - ((v >>> 1) & 0x55555555);                    // reuse input as temporary
    v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);     // temp
    return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; 
  }
} 
公共类布尔数组32{
私有int值;
公共布尔get(int-pos){
return(values&(1我有一个强烈的印象,即您将要对布尔值进行的任何压缩都将增加读写时间。(我的错误,我显然错过了我的药物治疗)。在涉及的存储方面,您将获得更多

在业务逻辑方面,位集是一个明智的选择。它在内部存储一个long,您可以将其转换为int。但是,由于位集过于谨慎,不会显示其私有部分,因此您需要按顺序获取每个位索引。这意味着,我想转换为int而不是直接使用字节并没有真正的优势。


因此,Stefan Haustein的roll your own解决方案(根据需要扩展以模拟位集)更适合您的存储需求,因为您不会产生任何不必要的开销。

对您来说更重要的是:高效存储还是高效(即快速)读/写?我认为快速读/写在这个应用程序中更为重要。您是只想一次写入和读取所有数组,还是需要对特定数组进行随机访问?是的,所有数组都是一次读取的。不需要随机访问。将其视为二维布尔数组,即布尔[10000][32]是否合理第一句肯定不是真的:存储是按字节或更大单位组织的,比内存访问和简单计算慢几个数量级。对于组织和内存访问率,你是正确的,但是你也需要考虑缓存。我会把我的答案考虑进去。我不知道缓存是什么。此处涉及。请注意,这并不是真正的压缩,只是将一位存储为单个位,而不是一个字节或更多。+1,现在,对于OP的必备项,这肯定比位集好。完全有意义!非常感谢!修复了集合中的一个错误,并将静态辅助项移到了底部。您可能需要重新检查位BitsInible帮助程序中的计数。让我们知道您的任务是否一切正常:)更新2:将bitcount更改为此处描述的方法:返回到离根源更近的几个步骤后,这是Ian Ashdown从1996年2月15日到comp.graphics.algorithms的帖子: