首页 > 其他 > 详细

BitSet

时间:2019-09-03 01:14:50      阅读:92      评论:0      收藏:0      [点我收藏+]

一、原理

  BitSet 类由 long 数组组成,我们知道,long类型数字是64位,如果将 N 个long数字的bit连起来,则可以表示 64*N个数字的存在性(存在标志为1,不存在标志为0)。

二、源码分析

1、构造参数

    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; }

2、set方法

   先计算出该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); }

3、get方法

  这里主要还是  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);
    }

 

BitSet

原文:https://www.cnblogs.com/lovezmc/p/11450578.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!