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
相关推荐
IT_陈寒36 分钟前
Vite项目build后路由404了?你可能漏了这个小配置
前端·人工智能·后端
宸津-代码粉碎机1 小时前
Spring AI企业级实战|从RAG优化到Agent多工具调度
java·大数据·人工智能·后端·python·spring
吴佳浩1 小时前
AI Infra 的真相:Go 没输,rust也不是取代
后端·rust·go
喵个咪1 小时前
实时游戏网络协议深度对比:KCP vs WebRTC vs WebSocket
后端·websocket·webrtc
普通网友1 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
QuZero2 小时前
Guava Cache Deep Dive
java·后端·算法·guava
leeyi2 小时前
SSE 实时推流 —— Token 怎么一个个蹦出来
后端·agent
leeyi2 小时前
ReAct 循环的 50 行 Go 实现,逐行拆解
后端·agent
leeyi2 小时前
HITL:让人类随时叫停 AI,并且能优雅地继续
后端·agent
用户34232323763172 小时前
采集网关的离线缓存与断点续传——当网络不可靠时,数据一条都不能丢
后端