【Java】深入了解下Java Bitset

时间:2025-03-23 07:30:52

【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数组——它是一个聪明、高效工具,使得管理位变得非常酷。希望这给了你一窥其内部工作原理的视角,以及为什么它值得探索。