保存的是一个对应位置的布尔值,内部采用的是long类型的数组进行实现 。那么它就是如何实现快速定位到对应的元素呢,我们对于源码进行分析,就可以见一二 。
首先,打开的源码,查找到有一个属性值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;
【学习BitSet集合中set方法的小结】在java的源码中,大量使用到位运算,在性能上有明显的优势,推荐一本关于位运算的书《’s 》,Java源码中很多地方的位运算都是源自该书 。
文章插图
继续正题,下面来看下在set值的时候是如何对应到bit位置,在代码中有对应的注释信息:
/*** Sets the bit at the specified index to {@code true}.** @parambitIndex a bit index* @throws IndexOutOfBoundsException if the specified index is negative* @sinceJDK1.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
- 人间炼狱到非洲之星,卢旺达学习中国模式快速崛起,GDP翻了13倍 卢旺达世界之最
- 为什么说学播音毁一生,我为什么学习播音主持
- 集合三所名校近40年的办学经验,广州南沙最受瞩目的幼儿园登场啦 幼儿园分享中国之最有哪些
- 宝妈带孩子学习——56个民族卡通简笔画 彩色版 中国之最简笔画彩色
- CS269I:Incentives in Computer Science 学习
- TestLink学习五:TestLink1.9.13和JIRA6.3.6的集成
- 5 没事儿就学习:快速排序(Fortran)
- 【Linux Mint 深度学习开发环境搭建】开发软件安装
- 开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!...
- UI设计师需要学习什么?从菜鸟到精英的必备课