Java运算符终极指南:从基础算术到位运算实战

Java运算符终极指南:从基础算术到位运算实战

基础算术运算符的陷阱

java 复制代码
int a = 5 / 2;       // 结果=2(整数地板除)
double c = 5.0 / 2;  // 结果=2.5(自动类型提升)

System.out.println(9 % 5);   // 4(取余运算)
System.out.println(-9 % 5);  // -4(保留符号)

// 正确判断奇偶(考虑负数情况)
public static boolean isOdd(int number) {
    return number % 2 != 0;  // 避免使用==1
}

关键点

  • 整数除法会截断小数部分(地板除)
  • 取余运算结果符号与被除数相同
  • 类型提升规则:运算结果自动提升为最高精度类型

自增运算符的底层机制

a += 1 实际执行三步操作:

  1. 从内存读取a的值到CPU寄存器
  2. CPU执行+1运算
  3. 将结果写回内存
java 复制代码
int x = 5;
int y = x++;  // y=5, x=6(先赋值后自增)
int z = ++x;  // z=7, x=7(先自增后赋值)

逻辑运算符的短路特性

java 复制代码
// 避免空指针的典型用法
Boolean config = getConfig();  // 可能返回null

if(config != null && config) {
    // 当config为null时,后半部分不会执行
    System.out.println("配置开启");
}

短路规则

  • &&:左操作数为false时跳过右侧计算
  • ||:左操作数为true时跳过右侧计算
  • 三元运算符?:应避免嵌套以保证可读性

位运算核心原理

1. 补码:负数的二进制表示

  • 正数:原码=反码=补码
  • 负数:补码=反码+1(符号位固定为1)
  • 优势:统一加减法运算逻辑

2. 位运算实战

运算 示例 特点
按位与(&) 6 & 3 = 2 清零特定位
按位或(|) 6 | 3 = 7 设置特定位
异或(^) 6 ^ 3 = 5 不进位加法(X^X=0)
左移(<<) 8 << 1 = 16 等效×2(低位补0)
带符号右移(>>) -8 >> 1 = -4 高位补符号位
无符号右移(>>>) -8 >>> 1 = 2147483644 高位补0

位运算的工程应用:属性压缩存储

传统方案:32个布尔属性需要32个boolean(约32字节)

java 复制代码
boolean isPublic;
boolean isProtected;
boolean isPrivate;
// ...共32个属性

位运算优化:用单个int(4字节)存储32个属性

java 复制代码
int modifiers = 0;

// 设置PUBLIC标志位(按位或)
modifiers |= 0x0001;  

// 检查PROTECTED标志位(按位与)
boolean isProtected = (modifiers & 0x0002) != 0; 

JDK实战案例java.lang.reflect.Modifier

java 复制代码
public static final int PUBLIC    = 0x00000001;
public static final int PRIVATE   = 0x00000002;
public static final int PROTECTED = 0x00000004;

// 检查修饰符
public static boolean isPublic(int mod) {
    return (mod & PUBLIC) != 0;
}

字符串连接优化

java 复制代码
String result = "值=" + 10;  // 自动调用Integer.toString(10)

// 实际编译为:
StringBuilder sb = new StringBuilder();
sb.append("值=");
sb.append(10);
String result = sb.toString();
  • 连续+操作会被编译器优化为StringBuilder
  • 循环中拼接字符串仍需手动使用StringBuilder
相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿10 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909611 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒12 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构13 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构13 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构14 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常15 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端