2012-01-13 99 views
6

我的算法使用了大量的boolean,正如我所教导的,每个布尔变量需要1个字节。无论如何要声明一个布尔数组并减少内存使用量,因为我正在使用电话环境。是否有可能在Java中声明一个1位变量?

编辑:我和我的朋友正在讨论如果BitSet比正常布尔数组慢。请澄清这一点。该算法仍然需要满足最佳需求的性能。

+12

[java.util.BitSet](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)?或者我错过了什么? – Mysticial 2012-01-13 05:19:25

+2

Geez ...我应该停止犹豫并发布这些答案... – Mysticial 2012-01-13 05:22:24

+2

@Mysticial:在犹豫中稍微犹豫一下。 ;) – Mehrdad 2012-01-13 05:23:44

回答

18

BitSet

此类实现按需增长的位向量。该位组的每个 组件都有一个布尔值。 BitSet的位是由非负整数索引的 。个别索引位可以是 检查,设置或清除。一个BitSet可用于通过逻辑AND,逻辑与或, 和逻辑异或操作来修改另一个BitSet的内容 。

Link to benchmark使用booleanBitSet

+0

谢谢。但请回答我在EDIT中添加的问题。 – 2012-01-13 13:29:20

1

可以使用EnumSet以及之间。这允许您使用命名位,并且可以比使用索引位的BitSet更友好。

专门用于枚举类型的Set实现。枚举集合中的所有元素必须来自单个枚举类型,该集合类型在创建集合时显式或隐式指定。枚举集在内部表示为位向量。这种表示非常紧凑和高效。这个类的空间和时间性能应该足够好,可以用作传统的基于int的“比特标志”的高质量,类型安全的替代品。即使批量操作(如containsAll和retainAll)也应该运行得非常快,如果它们的参数也是一个枚举集合。

例如

BitSet bs = new BitSet(4); 
bs.set(1); // READY 
bs.set(3); // LARGE_FLAG 
boolean largeFlag = bs.get(1); // LARGE_FLAG 
System.out.println("Using BitSet: "+bs); 

EnumSet<Settings> settings = EnumSet.noneOf(Settings.class); 
settings.add(Settings.READY); 
settings.add(Settings.LARGE_FLAG); 
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG); 
System.out.println("Using EnumSet: "+settings); 

打印

Using BitSet: {1, 3} 
Using EnumSet: [READY, LARGE_FLAG] 

恕我直言,EnumSet是如果合适的更加清晰。

相关问题