学习BitSet集合中set方法的小结
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方法的小结相关推荐
- java中load_java之Properties集合中的方法load
各位小伙伴们大家好在之前文章中小编介绍了java之Properties集合中的方法store,这次小编要介绍的是Properties集合中的方法load,具体如下: 可以使用Properties集合中 ...
- Java Store_java之Properties集合中的方法store
各位小伙伴们大家好,在之前的文章中,小编介绍了使用Properties集合存储数据,这次小编要介绍的是Properties集合中的方法store,具体如下: 可以使用Properties集合中的方法s ...
- Java集合中contains方法的效率对比
Java集合中contains方法的效率对比 Java集合List.Set中均有对集合中元素是否存在的判断方法contains(Object o):Map中有对key及value是否存在的判断方法co ...
- List集合中remove方法的使用
以ArrayList为例: //泛型为引用数据类型: ArrayList<String> list=new ArrayList<String>();list.add(" ...
- Map集合中的方法(添加、删除、判断、获取)
/* Map集合:该集合存储键(K)值(V)对,一对一往里存,而且要保证键的唯一性. 1.添加 put(K key,V value) putAll(Map<? extends K,? exten ...
- JAVA不同类型数组重载_java学习笔记--java中的方法与数组
方法 完成特定功能的代码块 方法的格式 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){ //方法体 return 返回值: } 方法的调用方式 通过方法名调用方法 根据形 ...
- Web开发学习笔记:ngIf中使用方法判断字符串中是否包含子字符串
<p *ngFor="let item of UseTypes"><ion-select-option *ngIf="globalVariable.is ...
- Java 集合中的方法性能分析
文章目录 前言 一.List集合 1.1.Collection 中 get() 和 remove()方法的效率 示例一 示例二 总结 前言 暂无 一.List集合 1.1.Collection 中 g ...
- java集合中retainAll方法
A.retainAll(B) 可以看到这个方法改变了集合A中的元素,将存在于集合A中但不存在于集合B中的元素移除. 如果集合A的大小发生了改变,返回true,即使两个集合完全没有交集,也会返回true ...
最新文章
- 网络:TCP/UDP
- RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)
- Struts 2基础入门
- 使用Nancy打造TaskManager2.0管理系统
- 嵌入式基础认识2:shell脚本的一些简单语法规则
- 细品慢酌QuickTest关键视图(4)
- 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
- ​使用 QuickBI 搭建酷炫可视化分析
- sklearn特征选择类库使用小结
- java面试题,各大企业常见的java笔试题及答案(精华)
- Ubuntu16.04 + cuda8.0 + GTX1080 + matlab14.04a + Opencv3.0 + caffe 安装教程
- 数据走进宫崎骏的动画世界
- 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
- wma转mp3怎么弄_wma格式怎么转换mp3
- 机器学习笔记(四)——正则化
- kasp技术原理_KASP-基于已知SNP的高通量基因分型
- 全自动软化水设备:全自动软化水设备选型要点说明
- 橄榄核雕:始知真放在精微
- 2010年Oracle大事记
- 【新媒体】现阶段新闻聚合的玩法 1