BitSet 类由 long 数组组成,我们知道,long类型数字是64位,如果将 N 个long数字的bit连起来,则可以表示 64*N个数字的存在性(存在标志为1,不存在标志为0)。
public BitSet(int nbits) { // nbits can‘t be negative; size 0 is OK if (nbits < 0) throw new NegativeArraySizeException("nbits < 0: " + nbits); initWords(nbits); sizeIsSticky = true; //标识words大小由用户指定 } // private void initWords(int nbits) { words = new long[wordIndex(nbits-1) + 1]; } // 因为long类型是64位,所以bitIndex/64就可以得到bitIndex位于Long数组的第几位private static int wordIndex(int bitIndex) {
// ADDRESS_BIT_PER_WORD = 6 return bitIndex >> ADDRESS_BITS_PER_WORD; }
先计算出该index应该放在数组的哪一位,然后再该long的指定位置置1。
public void set(int bitIndex) { if (bitIndex < 0) throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); int wordIndex = wordIndex(bitIndex); expandTo(wordIndex); // 给对应的bitIndex位设置为1(1 << 65 = 2:溢出后归0了,当bitIndex>64时,实际上bitIndex=bitIndex%64)
// 1 << bitIndex = 2^bitIndex = 1000...(bitIndex个0) words[wordIndex] |= (1L << bitIndex); // Restores invariants checkInvariants(); }
// 判断是否需要扩容 private void expandTo(int wordIndex) { int wordsRequired = wordIndex+1; if (wordsInUse < wordsRequired) { ensureCapacity(wordsRequired); wordsInUse = wordsRequired; } } // 扩容操作,2倍扩容 private void ensureCapacity(int wordsRequired) { if (words.length < wordsRequired) { // Allocate larger of doubled size or required size int request = Math.max(2 * words.length, wordsRequired); words = Arrays.copyOf(words, request); sizeIsSticky = false; } } /** * Every public method must preserve these invariants. */ private void checkInvariants() { assert(wordsInUse == 0 || words[wordsInUse - 1] != 0); assert(wordsInUse >= 0 && wordsInUse <= words.length); assert(wordsInUse == words.length || words[wordsInUse] == 0); }
这里主要还是 words[wordIndex] & (1L << bitIndex) != 0,判断指定位上是否为1.
public boolean get(int bitIndex) { if (bitIndex < 0) throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); checkInvariants(); int wordIndex = wordIndex(bitIndex); return (wordIndex < wordsInUse) && ((words[wordIndex] & (1L << bitIndex)) != 0); }
原文:https://www.cnblogs.com/lovezmc/p/11450578.html