BitSet保存的是一个对应位置的布尔值,内部采用的是long类型的数组进行实现。那么它就是如何实现快速定位到对应的元素呢,我们对于源码进行分析,就可以见一二。
首先,打开BitSet的源码,查找到有一个属性值long[] words

    /*** The internal field corresponding to the serialField "bits".* 内部的字段类似处理连续的“位”*/private long[] words;

内部的元素的布尔值是利用bit进行表示的,在数组当中,一个long的值就代表的是64个布尔值。在内部定义了常量的信息:

    /** BitSets are packed into arrays of "words."  Currently a word is* a long, which consists of 64 bits, requiring 6 address bits.* The choice of word size is determined purely by performance concerns.* BitSets 被存储在数组words中。一个word是一个由64个bit组成的long值,需要6位地址位(64 = 2^6)* word的大小选择由性能决定。*/private final static int ADDRESS_BITS_PER_WORD = 6;private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;

在java的源码中,大量使用到位运算,在性能上有明显的优势,推荐一本关于位运算的书《Hacker’s Delight》,Java源码中很多地方的位运算都是源自该书。
继续正题,下面来看下在set值的时候是如何对应到bit位置,在代码中有对应的注释信息:

    /*** Sets the bit at the specified index to {@code true}.** @param  bitIndex a bit index* @throws IndexOutOfBoundsException if the specified index is negative* @since  JDK1.0*/public void set(int bitIndex) {//小于0直接报错if (bitIndex < 0)throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);//计算当前bitIndex所在的long数值的位置int wordIndex = wordIndex(bitIndex);//bitIndex的值大于现有的长度,则进行扩容expandTo(wordIndex);//此处位关键的点,在进行 << bitIndex的时候,可以直接定位到对应的位置words[wordIndex] |= (1L << bitIndex); // Restores invariantscheckInvariants();}

对于**(1L << bitIndex)**的理解
对于一个long类型的值而言,bit位是64,如果bitIndex 超过64则会发生什么呢,通过查找资料,其实这个语句可以改成如下(会比较好理解,性能估计就差了):

(1L << (bitIndex % 64))

这里要注意的一点的是数值1后面必须加上L,否则系统会认为是int类型,就会出现如下的情况

(1 << (bitIndex % 32))

下面举个例子来说明
执行 bitSet.set(128)
计算出来:wordIndex = 4;
(1L << bitIndex ) = 1
进行位操作或的结果就是

内容有点粗糙,有不对的地方望指正!

学习BitSet集合中set方法的小结相关推荐

  1. java中load_java之Properties集合中的方法load

    各位小伙伴们大家好在之前文章中小编介绍了java之Properties集合中的方法store,这次小编要介绍的是Properties集合中的方法load,具体如下: 可以使用Properties集合中 ...

  2. Java Store_java之Properties集合中的方法store

    各位小伙伴们大家好,在之前的文章中,小编介绍了使用Properties集合存储数据,这次小编要介绍的是Properties集合中的方法store,具体如下: 可以使用Properties集合中的方法s ...

  3. Java集合中contains方法的效率对比

    Java集合中contains方法的效率对比 Java集合List.Set中均有对集合中元素是否存在的判断方法contains(Object o):Map中有对key及value是否存在的判断方法co ...

  4. List集合中remove方法的使用

    以ArrayList为例: //泛型为引用数据类型: ArrayList<String> list=new ArrayList<String>();list.add(" ...

  5. Map集合中的方法(添加、删除、判断、获取)

    /* Map集合:该集合存储键(K)值(V)对,一对一往里存,而且要保证键的唯一性. 1.添加 put(K key,V value) putAll(Map<? extends K,? exten ...

  6. JAVA不同类型数组重载_java学习笔记--java中的方法与数组

    方法 完成特定功能的代码块 方法的格式 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){ //方法体 return 返回值: } 方法的调用方式 通过方法名调用方法 根据形 ...

  7. Web开发学习笔记:ngIf中使用方法判断字符串中是否包含子字符串

    <p *ngFor="let item of UseTypes"><ion-select-option *ngIf="globalVariable.is ...

  8. Java 集合中的方法性能分析

    文章目录 前言 一.List集合 1.1.Collection 中 get() 和 remove()方法的效率 示例一 示例二 总结 前言 暂无 一.List集合 1.1.Collection 中 g ...

  9. java集合中retainAll方法

    A.retainAll(B) 可以看到这个方法改变了集合A中的元素,将存在于集合A中但不存在于集合B中的元素移除. 如果集合A的大小发生了改变,返回true,即使两个集合完全没有交集,也会返回true ...

最新文章

  1. 网络:TCP/UDP
  2. RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)
  3. Struts 2基础入门
  4. 使用Nancy打造TaskManager2.0管理系统
  5. 嵌入式基础认识2:shell脚本的一些简单语法规则
  6. 细品慢酌QuickTest关键视图(4)
  7. 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
  8. ​使用 QuickBI 搭建酷炫可视化分析
  9. sklearn特征选择类库使用小结
  10. java面试题,各大企业常见的java笔试题及答案(精华)
  11. Ubuntu16.04 + cuda8.0 + GTX1080 + matlab14.04a + Opencv3.0 + caffe 安装教程
  12. 数据走进宫崎骏的动画世界
  13. 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
  14. wma转mp3怎么弄_wma格式怎么转换mp3
  15. 机器学习笔记(四)——正则化
  16. kasp技术原理_KASP-基于已知SNP的高通量基因分型
  17. 全自动软化水设备:全自动软化水设备选型要点说明
  18. 橄榄核雕:始知真放在精微
  19. 2010年Oracle大事记
  20. 【新媒体】现阶段新闻聚合的玩法 1

热门文章

  1. 解析英国最有前途专业之一:大数据分析技术
  2. Iris:医疗行业的区块链解决方案
  3. MS9288C 是一款低成本、低功耗、高性能的 VGA 转 HDMI转换器
  4. 美味超你想象!郑州机场民航餐厅打造智慧餐饮服务
  5. 品牌是选择KOC还是KOL?抖音KOC如何进行推广投放?
  6. oracle中split的使用方法,Oracle 自定义split 函数实例详解
  7. 图形杂记--基础概念补充
  8. IE捉迷藏bug详解(躲猫猫)
  9. Google 要把 Quickoffice 下架,要用就快下载了
  10. CentOS 7虚拟机安装常用软件