Java:布尔数组和 BitSet 之间的区别?
根据 BitSet 的文档,
“这个类实现了一个根据需要增长的位向量。位集的每个组件都有一个布尔值。”
这让我想,BitSet() 和 boolean[] 数组有什么区别?
1)内存中分配的空间量有什么不同吗?
如果我创建大小为 1000 万的布尔数组和位集,内存分配有什么区别
2)哪个更快?
a 的文档BitSet
非常清楚地暗示实现不一定是实际的布尔数组。尤其:
每个位集都有一个当前大小,即该位集当前使用的空间位数。请注意,大小与位集的实现有关,因此它可能会随着实现而改变。位集的长度与位集的逻辑长度相关,并且独立于实现来定义。
Java 库类的源代码是公开可用的,您可以自己轻松地检查它。尤其:
The internal field corresponding to the serialField "bits".
89
90 private long[] words;
至于速度;剖析它。这取决于你在做什么。一般来说,不要提前考虑速度;使用在语义上最有意义的任何工具,并导致最清晰的代码。只有在观察到您的性能要求没有得到满足并确定瓶颈之后才能进行优化。
在任何情况下,显然,我认为直接访问布尔数组中的值比查找长数组中的位要快,但是对两个长值执行按位或比在 64 上执行逻辑或更快布尔值。想一想。例如:
613 public boolean get(int bitIndex) {
614 if (bitIndex < 0)
615 throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
616
617 checkInvariants();
618
619 int wordIndex = wordIndex(bitIndex);
620 return (wordIndex < wordsInUse)
621 && ((words[wordIndex] & (1L << bitIndex)) != 0);
622 }
至于其他的区别,显然API是不同的。BitSet
提供了许多您可能需要使用的按位运算。boolean
数组就是数组。最适合您的一种将取决于您的特定应用要求。
内存差异应为 8 倍。
对于您的第二个问题:更快地做什么?