【Java】深入了解下Java Bitset
推荐超级课程:
- 本地离线DeepSeek AI方案部署实战教程【完全版】
- Docker快速入门到精通
- Kubernetes入门到大师通关课
- AWS云服务快速入门实战
目录
- 【Java】深入了解下Java Bitset
- 引言
- 如果Java Bitset不是布尔数组,那它是什么?
- 位操作
- 来自Java Bitset内部的引用
- **set()**
- **get()**
引言
如果你曾经认为Java的BitSet
只是一个被美化的布尔数组,那你并不孤单。我以前也这么想,直到我窥视了它的内部结构。我所发现的是相当令人惊讶的,如果你也感到好奇,那么接下来的内容将会是一场盛宴。让我们深入探讨为什么BitSet
比看起来要酷得多。
如果Java Bitset不是布尔数组,那它是什么?
Java BitSet
远不止是一个简单的boolean
数组。它使用long
数据类型的位操作来高效地存储和管理数据。如果这听起来令人困惑,别担心——我们会逐步分解。
位操作
Java中的long
是一个64位的数字,这意味着它可以存储64个单独的位。通过位操作,你可以直接控制这每一个位。
例如,要在long
变量中设置一个特定的位(假设是第12位),你可以使用或(OR)操作。想象你有一个64位的long
变量叫做data,你想将第12位设置为1。你会这样做:
data | 0000000000010000000000000000000000000000000000000000000000000000L
在这里,除了你想要设置的位之外,其他都是0。因此,只有那个位会被更新,而其余的保持不变。
现在,如果你想要检查这个变量中第12位的值,你会使用与(AND)操作:
data & 0000000000010000000000000000000000000000000000000000000000000000L
这将根据该位是否被设置返回0或1。
来自Java Bitset内部的引用
Bitset
将所有data存储在一个long
数组中。这会根据客户端的数据需求不断变化,就像Java中的大多数集合一样。
如果你想存储第1000位,你首先找到数组中的正确索引。然后,确定哪个特定的位(在那个long
中的64位)代表第1000位。一旦你确定了它,就在那个位上执行必要的位操作。
set()
当需要在Bitset
中设置某项时,会调用[set()](https://github.com/JetBrains/jdk8u_jdk/blob/master/src/share/classes/java/util/BitSet.java#L442)
方法。这个方法首先找出这个位将落入的数组索引。然后,它验证数组是否有必要的容量来存储它。之后,它简单地使用上面看到的或(OR)操作来设置位。
get()
[get()](https://github.com/JetBrains/jdk8u_jdk/blob/master/src/share/classes/java/util/BitSet.java#L621)
操作的工作方式类似。我们首先找出这个位将落入的数组索引。然后,我们确保这个位置在有效范围内。如果是的话,我们使用与(AND)操作来提取位值。BitSet
提供了许多附加功能,但为了保持文章的焦点,我们在这里不会深入探讨所有功能。如果你好奇,我鼓励你通过查看源代码来探索其全部功能——这会是一次令人着迷的阅读!
Java BitSet
远不止是一个花哨的boolean
数组——它是一个聪明、高效工具,使得管理位变得非常酷。希望这给了你一窥其内部工作原理的视角,以及为什么它值得探索。