当前位置: 首页 > news >正文

【Java】深入了解下Java Bitset

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

相关文章:

  • SOFABoot-09-模块隔离
  • 计算机的基本组合和工作原理
  • 日志2333
  • 大模型幻觉产生的【九大原因】
  • Browser Use Web UI 本地部署完全指南:从入门到精通
  • 分享最近前端面试遇到的一些问题
  • bootstrap 表格插件bootstrap table 的使用经验谈!
  • ✨【数据变形术:联合体在通信协议中的降维打击】✨
  • 编程考古-安德斯·海尔斯伯格(Anders Hejlsberg)回答离开Borland的原因
  • arcgispro加载在线地图
  • 人工智能在智能交通中的应用:以L4级无人电动物流拖车为例
  • 收数据花式画图plt实战
  • iptables和netfilter内部报文处理
  • 火语言RPA--表格内容过滤筛选
  • JavaScript基础-删除事件(解绑事件)
  • 【Golang】slice切片
  • neo4j删除所有数据
  • mysql——第二课
  • [蓝桥杯 2023 省 B] 子串简写
  • 基于Azure云平台整合Delta Lake、Databricks和Azure Machine Learning的MLOps架构
  • 视频丨英伟达总裁黄仁勋:美勿幻想AI领域速胜中国
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 马上评丨准入壁垒越少,市场活力越足
  • 许峰已任江苏省南京市副市长