java位掩码用int每位作独立开关,0关1开,单int存32种状态,省空间且快;状态常量须为2的幂(如1、2、4、8…),推荐左移明确位序。

Java 中用位掩码组合多个布尔状态,本质是把一个 int(或 long)的每一位当作独立开关:0 表示关闭,1 表示开启。单个 int 就能紧凑承载最多 32 种状态,比多个 boolean 字段或集合更省空间、更快,特别适合权限控制、配置开关、状态标记等高频读写场景。
定义状态常量:必须是 2 的幂,推荐用左移明确位序
每个状态必须独占一位,因此值只能是 1、2、4、8……即形如 1 的整数。手写 <code>1、2、4 容易出错且难维护,应统一用左移表达语义:
public static final int READ = 1 → 二进制 <code>0001public static final int WRITE = 1 → 二进制 <code>0010public static final int EXECUTE = 1 → 二进制 <code>0100public static final int DELETE = 1 → 二进制 <code>1000
这样每位互不干扰,也方便扩展到第 31 位(1 ),充分利用 <code>int 的全部容量。
组合多个状态:用按位或(|)叠加
将需要启用的状态用 | 运算“合并”,结果整数的二进制中为 1 的位,就代表对应状态已激活:
-
int permissions = READ | WRITE;→ 值为3(0011) -
permissions |= EXECUTE;→ 等价于permissions = permissions | EXECUTE,追加执行权限 -
int full = READ | WRITE | EXECUTE | DELETE;→ 值为15(1111)
注意:permissions == READ | WRITE 是常见错误——这是先执行按位或再比较,逻辑完全不对;正确组合只用 |,判断时另做处理。
判断是否启用某状态:必须用按位与(&)并显式比 0
检测某一位是否为 1,要用 & 运算后和 0 比较,因为 Java 的 if 条件只接受布尔值:
if ((permissions & WRITE) != 0) { /* 有写权限 */ }if ((permissions & DELETE) == 0) { /* 无删除权限 */ }if ((permissions & (READ | EXECUTE)) == (READ | EXECUTE)) { /* 同时具备读和执行 */ }
直接写 if (permissions & WRITE) 会编译失败——这点极易忽略,括号和 != 0 缺一不可。
动态修改状态:增、删、切都靠位运算
所有操作基于整数位运算,无对象分配、无循环、原子高效:
-
添加:用
|=,如flags |= READ; -
移除:用
&= ~,如flags &= ~WRITE;(先取反再与,清零对应位) -
切换:用
^=,如flags ^= EXECUTE;(有则关,无则开)
避免用减法清除状态,例如 flags -= WRITE —— 若该位原本未设置,会误改其他位,导致状态错乱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











