**
一、算术运算符
**
包括 +
(加)、-
(减)、*
(乘)、/
(除)、%
(取余)、++
(自增)、--
(自减)。
- 整数除法特性:两个整数相除结果为整数(直接舍去小数),例如
5/2=2
;若需精确结果,需至少一个操作数为浮点数(如5.0/2=2.5
)。 - 自增/自减:
i++
:先取值再自增(返回原值);++i
:先自增再取值(返回新值)。
- 字符运算:
char
类型参与运算时转为ASCII码(如'A'+10=75
),需强制类型转换才能输出字符。
二、赋值运算符
包括 =
、+=
、-=
、*=
、/=
、%=
等复合运算符。
- 复合运算符特性:自动处理类型转换,例如
byte a=10; a +=5
不会报错,而直接a = a+5
会因类型提升导致编译错误。 - 字符串连接符:
+
用于字符串拼接(如"a"+5="a5"
),但非字符串类型会隐式转换为字符串。
三、关系运算符(比较运算符)
包括 ==
、!=
、>
、<
、>=
、<=
,返回布尔值 true/false
。
- 对象比较:
instanceof
用于判断对象是否属于某个类(如"abc" instanceof String → true
)。 - 浮点数比较:避免直接比较浮点数相等(精度问题),建议使用差值阈值。
四、逻辑运算符
- 基本逻辑运算符:
&
(逻辑与):两表达式均为真时结果为真;|
(逻辑或):任一表达式为真则结果为真;!
(逻辑非):取反;^
(异或):两表达式不同为真。
- 短路运算符(高效特性):
&&
(短路与):左边为假则右边不执行;||
(短路或):左边为真则右边不执行。
五、位运算符
针对二进制补码进行逐位操作:
- 基础运算符:
&
(按位与):全1则1,否则0;|
(按位或):有1则1;~
(按位非):取反;^
(按位异或):相同为0,不同为1。
- 移位运算符:
<<
(左移):高位丢弃,低位补0(相当于乘2);>>
(带符号右移):正数补0,负数补1(相当于除2);>>>
(无符号右移):高位补0。
六、三元运算符(条件运算符)
格式:条件 ? 表达式1 : 表达式2
,例如 int max = (a > b) ? a : b
。
- 应用场景:简化简单的
if-else
逻辑,但嵌套过深会降低可读性。
注意事项
- 类型提升规则:运算中低精度类型自动提升为高精度类型(如
byte + int → int
)。 - 运算符优先级:括号
()
最高,赋值运算符=
最低,完整优先级需参考官方文档。 - 特殊值处理:
0/0.0
得到NaN
,可用Double.isNaN()
检测;非零数除以0得到Infinity
。
Java运算符应用示例(结合常见开发场景)
一、算术运算符
- 整数除法与浮点转换
应用场景:计算商品数量分页时需整数除法,财务计算需浮点精度。int a = 5 / 2; // 结果:2(舍去小数) double b = 5.0 / 2; // 结果:2.5(浮点运算)
2. 自增运算符特性
int i = 5;
int x = i++; // x=5(先赋值再自增)
int y = ++i; // y=7(先自增再赋值)
应用场景:循环计数器或顺序生成唯一ID。
3. 字符运算转换
char c = 'A';
int code = c + 10; // 结果:75(ASCII码计算)
char newC = (char) code; // 强制转换后:'K'
应用场景:加密算法中字符偏移处理。
二、赋值运算符
-
复合赋值类型转换
byte num = 10; num += 5; // 合法,等价于 num = (byte)(num + 5) // num = num + 5; // 编译错误(类型提升为int)
应用场景:硬件寄存器操作时避免类型溢出。
-
字符串拼接
String s = "ID:" + 1001; // 结果:"ID:1001"
应用场景:动态生成日志信息或SQL语句。
三、关系运算符
-
浮点数比较
double d1 = 0.1 + 0.1 + 0.1; double d2 = 0.3; boolean isEqual = Math.abs(d1 - d2) < 1e-6; // 避免精度误差
应用场景:金融计算或科学实验数据校验。
-
对象类型判断
Object obj = "Hello"; if (obj instanceof String) { // 结果为true System.out.println("字符串类型"); }
应用场景:反射机制或泛型类型检查。
四、逻辑运算符
-
短路特性优化性能
if (list != null && list.size() > 0) { // 若list为null,list.size()不会执行 }
应用场景:避免空指针异常,提升代码健壮性。
-
异或加密
int data = 0b1010; int key = 0b1100; int encrypted = data ^ key; // 加密结果:0110
应用场景:简单数据加密或校验码生成。
五、位运算符
-
高效乘除运算
int a = 8 << 2; // 结果:32(等价于8*2²) int b = 16 >> 1; // 结果:8(等价于16/2)
应用场景:图像处理或底层协议解析。
-
奇偶判断
int num = 7; boolean isOdd = (num & 1) == 1; // 结果为true
应用场景:算法优化或位掩码操作。
六、三元运算符
int score = 85;
String result = (score >= 60) ? "及格" : "补考"; // 结果:及格
-应用场景*:简化条件分支,如状态码转换或UI显示逻辑。
Java运算符综合应用案例
简易用户权限管理系统(基于位运算与逻辑判断)
案例背景
设计一个用户权限管理系统,通过位运算符高效管理权限标识,结合逻辑运算符进行权限校验,使用三元运算符简化状态输出,并通过算术/关系运算符处理用户输入验证。
核心实现代码
public class PermissionSystem {
// 权限常量定义(位运算左移生成唯一标识)
public static final int READ = 1 << 0; // 0001 (1)
public static final int WRITE = 1 << 1; // 0010 (2)
public static final int DELETE = 1 << 2; // 0100 (4)
public static final int ADMIN = 1 << 3; // 1000 (8)
static class User {
private String name;
private int permissions; // 用二进制位组合存储权限
public User(String name) {
this.name = name;
this.permissions = 0; // 初始无权限
}
// 添加权限(位或运算)
public void addPermission(int perm) {
if (perm < 1 || perm > 15) { // 关系运算符验证范围
System.out.println("无效权限码!");
return;
}
permissions |= perm; // 复合赋值运算符等价于 permissions = permissions | perm
System.out.println(name + " 权限更新: " + Integer.toBinaryString(permissions));
}
// 移除权限(位与非运算)
public void removePermission(int perm) {
permissions &= ~perm; // 位运算组合操作
System.out.println(name + " 权限更新: " + Integer.toBinaryString(permissions));
}
// 检查权限(位与运算 + 逻辑非判断)
public boolean hasPermission(int perm) {
return (permissions & perm) != 0; // 若结果非0则表示有权限
}
// 生成权限报告(三元运算符简化输出)
public String getPermissionReport() {
return "用户: " + name + "\n"
+ "读取权限: " + (hasPermission(READ) ? "✔" : "✘") + "\n"
+ "写入权限: " + (hasPermission(WRITE) ? "✔" : "✘") + "\n"
+ "删除权限: " + (hasPermission(DELETE) ? "✔" : "✘") + "\n"
+ "管理员: " + (hasPermission(ADMIN) ? "✔" : "✘");
}
}
public static void main(String[] args) {
User user = new User("Alice");
// 权限动态操作(结合算术运算符计算权限码)
user.addPermission(READ + WRITE); // 1+2=3 (0011)
user.addPermission(DELETE); // 0011 | 0100 = 0111 (7)
user.removePermission(WRITE); // 0111 & ~0010 = 0101 (5)
// 权限校验(逻辑与短路特性优化性能)
boolean canEdit = user.hasPermission(WRITE) && checkResourceAvailable();
System.out.println("编辑操作授权结果: " + canEdit);
// 输出权限报告
System.out.println(user.getPermissionReport());
}
// 模拟资源检查(避免空指针的短路逻辑)
private static boolean checkResourceAvailable() {
// 实际开发中可能涉及对象非空判断,如:resource != null && resource.isValid()
return false; // 假设资源不可用
}
}
运行结果与场景分析
-
权限更新日志
Alice 权限更新: 11 // 二进制 1011(实际为3,此处应为0011,需修正权限计算逻辑) Alice 权限更新: 111 Alice 权限更新: 101
说明:通过
|=
快速叠加权限,& ~
精准移除特定权限,二进制位直观反映权限状态。 -
权限校验逻辑
- 当
hasPermission(WRITE)
为false
时,&&
右侧的checkResourceAvailable()
不会执行,避免不必要的资源检查。
- 当
-
最终权限报告
用户: Alice 读取权限: ✔ 写入权限: ✘ 删除权限: ✔ 管理员: ✘
说明:三元运算符
? :
替代多重if-else
,使状态输出更简洁。
关键技术点
-
位运算符高效管理权限
- 用
<<
生成互斥权限标识,单整数存储多权限状态(最多32种权限) |=
和&= ~
实现权限动态增删,避免数据库频繁更新
- 用
-
类型安全与输入校验
- 关系运算符
<
和>
限制权限码范围 - 算术运算符
+
动态组合基础权限(如READ + WRITE=3
)
- 关系运算符
-
逻辑运算符短路特性
&&
在权限校验中提前终止无效判断,提升性能
-
复合赋值运算符
|=
替代permissions = permissions | perm
,代码更简洁且自动处理类型转换
扩展应用场景
- 加密算法:结合
^
异或运算符实现简单数据加密(如data ^ key
) - 性能优化:用
<<
和>>
替代乘除运算(如capacity << 1
实现容量翻倍) - 状态机设计:通过位运算组合多种系统状态(如订单状态:已支付+已发货+未评价)
通过此案例可看出,合理运用各类运算符能显著提升代码执行效率和可读性,尤其在底层系统开发中作用突出。
————————————————
最后我们放松一下眼睛