[英]java.util.BitSet — set() doesn't work as expected
我是否错过了明显痛苦的事情? 还是世界上没有人真正使用java.util.BitSet?
以下测试失败:
@Test
public void testBitSet() throws Exception {
BitSet b = new BitSet();
b.set(0, true);
b.set(1, false);
assertEquals(2, b.length());
}
我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false,并且从未设置为任何值...
(请注意,在构造函数中显式设置BitSet的大小无效,例如:
BitSet b = new BitSet(2);
人们确实使用BitSet
; 但是,他们将其用于其他用途。 最好将BitSet
视为Set<Integer>
一种非常紧凑的内存有效形式,它具有奇特的属性,您不能在其中添加负数。
以BitSet
的模式使用它们在BitSet
很常见
for (int id = set.nextSetBit(0); id >= 0; id = set.nextSetBit(id + 1)) {
// do stuff to a set index
}
在您做一些事以填补他们之后。 这等效于迭代Set
的元素。
这也让我感到困惑,不确定BitSet当前相当意外的功能背后的原理。 但是,由于它不是最终的,我们可以使用一些拥抱和扩展策略,并按照预期进行以下操作以获得具有长度语义的固定BitSet:
import java.util.BitSet;
/**
* Variation of BitSet which does NOT interpret the highest bit synonymous with
* its length.
*
* @author casper.bang@gmail.com
*/
public class FixedBitSet extends BitSet{
int fixedLength;
public FixedBitSet(int fixedLength){
super(fixedLength);
this.fixedLength = fixedLength;
}
@Override
public int length() {
return fixedLength;
}
}
假设该位集由long []支持,则最小大小为64(因为1 long为64位)。 大小增加了64的倍数,并且由于某种原因,它们没有维护使用带int的构造函数时要表示的位数。
// Abhay Dandekar
import java.util.BitSet;
public class TestBitSet {
public static void main(String[] args) {
BitSet bitSet = new BitSet();
System.out.println("State 0 : " + bitSet.size() + " : " + bitSet.length() );
bitSet.set(0, true);
bitSet.set(1, true);
System.out.println("State 1 : " + bitSet.size() + " : " + bitSet.length() );
bitSet.set(2, false);
bitSet.set(3, false);
System.out.println("State 2 : " + bitSet.size() + " : " + bitSet.length() );
bitSet.set(4, true);
System.out.println("State 3 : " + bitSet.size() + " : " + bitSet.length() );
}
}
一个简单的Java程序来显示内部发生的事情。 注意事项:
BitSet由长期支持
所有默认值均为false
返回长度时,它返回集合中最高“ true”值的索引+1。
下面的输出应该能够解释自己:
State 0 : 64 : 0
State 1 : 64 : 2
State 2 : 64 : 2
State 3 : 64 : 5
因此,得出以下结论:
不要使用长度来推断修改的位数
可以在布隆过滤器之类的场景中使用。 更多关于bloom过滤器的信息可以在谷歌上搜索..;)
希望这可以帮助
问候,
阿比·丹德卡(Abhay Dandekar)
好卡斯珀! 您的小改进确实应该已经存在于原始BitSet java def中! 我也建议这样做(append()和concat()对于各种用法很有用)
import java.util.BitSet;
public class fixBitSet extends BitSet {
public int fsize = 0;
public void set(int k, boolean value) {
if (k >= fsize)
fsize = k + 1;
super.set(k, value);
}
public void append(fixBitSet bs) {
for (int k = 0; k < bs.fsize; k++)
super.set(fsize + k, bs.get(k));
fsize += bs.fsize;
}
public static fixBitSet concat(fixBitSet[] vbs) {
final fixBitSet bs = new fixBitSet();
for (fixBitSet xbs : vbs)
bs.append(xbs);
return (bs);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.