我的算法使用了大量的boolean
,正如我所教导的,每个布尔变量需要1个字节。无论如何要声明一个布尔数组并减少内存使用量,因为我正在使用电话环境。是否有可能在Java中声明一个1位变量?
编辑:我和我的朋友正在讨论如果BitSet比正常布尔数组慢。请澄清这一点。该算法仍然需要满足最佳需求的性能。
我的算法使用了大量的boolean
,正如我所教导的,每个布尔变量需要1个字节。无论如何要声明一个布尔数组并减少内存使用量,因为我正在使用电话环境。是否有可能在Java中声明一个1位变量?
编辑:我和我的朋友正在讨论如果BitSet比正常布尔数组慢。请澄清这一点。该算法仍然需要满足最佳需求的性能。
此类实现按需增长的位向量。该位组的每个 组件都有一个布尔值。 BitSet的位是由非负整数索引的 。个别索引位可以是 检查,设置或清除。一个BitSet可用于通过逻辑AND,逻辑与或, 和逻辑异或操作来修改另一个BitSet的内容 。
Link to benchmark使用boolean
与BitSet
谢谢。但请回答我在EDIT中添加的问题。 – 2012-01-13 13:29:20
可以使用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是如果合适的更加清晰。
[java.util.BitSet](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)?或者我错过了什么? – Mysticial 2012-01-13 05:19:25
Geez ...我应该停止犹豫并发布这些答案... – Mysticial 2012-01-13 05:22:24
@Mysticial:在犹豫中稍微犹豫一下。 ;) – Mehrdad 2012-01-13 05:23:44