通过查看BitSet 源码可以发现其设置ADDRESS_BITS_PER_WORD默认为6.但是为什么呢?
首先BitSet内置的底层数据为long数组,阅读set(int bitIndex)发现,其首先通过bitIndex >> ADDRESS_BITS_PER_WORD找到wordIndex,然后通过 words[wordIndex] |= (1L << bitIndex); // Restores invariants来设置对应的数值位。
一个long 8字节,64位。1<<1是2,1<<65也是2.也就是说1右移动64+位就会超过long大小,导致重复。因此ADDRESS_BITS_PER_WORD最多为6。
假设ADDRESS_BITS_PER_WORD超过6设置为7 ,比如1和65对应的wordIndex都是0,但是1<<1和1<<65同样的值,则set(1)和set(65)冲突。导致问题。
综上所述由于底层数据结构为long数组,ADDRESS_BITS_PER_WORD最大能够设置为6
网友评论