改为使用java.util.BitSet
。它会比处理快得多boolean[]
。
此外,您真的应该问自己这 20 个是否boolean
真的应该是enum
,在这种情况下,您可以使用EnumSet
C 中位域技术的 Java 解决方案(请参阅:Effective Java 2nd Edition: Use EnumSet
instead of bit fields)。
BitSet
到/从int
转换
您也可以使用BitSet
并删除int
,但以防万一您需要这些:
static BitSet toBitSet(int i) {
BitSet bs = new BitSet(Integer.SIZE);
for (int k = 0; k < Integer.SIZE; k++) {
if ((i & (1 << k)) != 0) {
bs.set(k);
}
}
return bs;
}
static int toInt(BitSet bs) {
int i = 0;
for (int pos = -1; (pos = bs.nextSetBit(pos+1)) != -1; ) {
i |= (1 << pos);
}
return i;
}
两种不同的技术被故意用于教学目的。为了鲁棒性,BitSet
toint
转换应确保 32 位就足够了。
EnumSet
例子
此示例基于书中给出的示例:
import java.util.*;
public enum Style {
BOLD, ITALIC, UNDERLINE, STRIKETHROUGH;
public static void main(String[] args) {
Set<Style> s1 = EnumSet.of(BOLD, UNDERLINE);
System.out.println(s1); // prints "[BOLD, UNDERLINE]"
s1.addAll(EnumSet.of(ITALIC, UNDERLINE));
System.out.println(s1.contains(ITALIC)); // prints "true"
}
}
从API:
这种表示非常紧凑和高效。int
这个类的空间和时间性能应该足够好,以允许它用作传统的基于“位标志”的高质量、类型安全的替代品。