是否可以在Java中声明一个1位变量?

时间:2012-01-13 05:18:17

标签: java android memory memory-management boolean

我的算法使用了大量的boolean,并且据我所知,每个布尔变量需要1个字节。无论如何都要声明一个布尔数组并减少内存使用量,因为我正在处理电话环境。

编辑:我的朋友和我正在讨论BitSet是否比普通布尔数组慢。请澄清一下。该算法仍然需要性能作为最佳需求。

2 个答案:

答案 0 :(得分:18)

BitSet

  

该类实现了一个根据需要增长的位向量。每   位组的组件具有布尔值。 BitSet的位是   由非负整数索引。各个索引位可以是   检查,设置或清除。一个BitSet可用于修改   另一个BitSet的内容通过逻辑AND,逻辑包含OR,   和逻辑异或运算。

使用booleanBitSet

之间的

Link to benchmark

答案 1 :(得分:1)

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

  

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

e.g。

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会更清晰。