OpenJDK 源代码阅读之 BitSet
来源:互联网 发布:mac 查看svn版本号 编辑:程序博客网 时间:2024/05/05 09:11
概要
- 类继承关系
- 定义
- 要点
BitSet
类用来支持位操作,给它一个 size
,就会返回一个对象,代表 size
个位。可以完成“与或非”操作。
实现
试想一下,long
最多也就 64 位,假如我们想对 1000 位进行一些运算,要如何实现呢?这个类就告诉我们怎么用一个数组,去实现位操作。
- 数据
内部使用 long
类型的数组来存储数据。
- 初始化
初始化会根据的位数决定要申请多大的数组,long
类型是 64 位,所以你如果 nbits
是 1~64
,你只需要一个长度为1的数组就好。
- 扩充策略
要是数组不够用了,就要进行扩充,下面的函数会根据申请的 long
元素个数,经过与当前元素个数2倍的比较进行扩充。
- 位翻转
先根据索引位置 bitIndex
计算出相应的位在数组哪个元素里,然后再将 1 左移 bitIndex
位后与此元素作异或运算。注意bitIndex
如果超过了 64 位,会又循环回来,比如 1L << 69
其实和 1L << 5
是一样的,只不过异或的时候,一个与words[1]
异或,一个与 words[0]
。
类中还有其它位操作,比如置1,清0,只是和 flip
的位操作符不同。
还有一类是区间内翻转,这需要首先临到一个相应区间全为1的数字,再与 words
相应元素作运算。
如果区间跨越多个数组元素,还需要把中间的数个数组元素内容全部翻转。
- AND 操作
从这个函数体会一下,两个 BitSet
对象之间的 AND
操作如何进行,其实就是对应的数组元素之间作 AND
操作就行。
- hashCode
计算哈希值的操作,说实话,我是不太明白为什么这样算哈希值的,为什么这样能减少不同 BitSet
之间的碰撞呢?
剩下的东西我也不想分析了,总之,需要把握整体的思路,就是如何用一个数组去实现位操作,每次操作需要弄清楚,在数组的哪些元素上操作,与什么数字作位操作,做什么位操作。
- OpenJDK 源代码阅读之 BitSet
- OpenJDK 源代码阅读之 TreeMap
- OpenJDK 源代码阅读之 HashMap
- OpenJDK 源代码阅读之 String
- OpenJDK 源代码阅读之 ArrayList
- OpenJDK 源代码阅读之 LinkedList
- OpenJDK 源代码阅读之 Arrays
- OpenJDK 源代码阅读之 Collections
- OpenJDK 源代码阅读之 TimSort
- 开始OpenJDK源代码阅读
- 阅读openjdk源代码
- openJDK源代码阅读笔记
- OpenJDK 源代阅读之 ArrayDeque
- 下载jdk源代码 openjdk
- JDK源代码阅读之CharSequence
- keras源代码阅读之-Reshape
- OpenJDK 源码阅读之 Java 字节流输入类的实现
- OpenJDK 源码阅读之 Java 字节流输出类的实现
- 汇编编写彩票36选7摇奖
- linux 通信之无名管道学习
- EAGLE转Protel文件
- 访问或添加request / session / application属性
- PAT6-06. 任务调度的合理性
- OpenJDK 源代码阅读之 BitSet
- 表空间相关操作
- 我们却发现很难用语言完整的描绘
- 商品属性与商品产品之间的表设计结构,供参考!
- ubuntu 安装mysql
- [Network]Multimedia Networking
- leetcode - Climbing Stairs
- eclim Java/C使用配置
- 黑马程序员------毕老师视频笔记第18-21天------其他对象(System、Runtime、Data、Calendar、Math)