【Java】运算符全解:从基础到实战,一文吃透所有用法
大家好呀~ 作为 Java 入门的核心知识点,运算符是编写代码的基础工具。今天就带大家全面拆解 Java 中的各类运算符,结合实际代码示例,帮大家理清用法、避开坑点,新手也能轻松掌握!
一、算术运算符:最常用的数值计算工具
算术运算符主要用于数值运算,包括基本的加减乘除和自增自减,咱们逐个看用法:
public class ArithmeticDemo {
public static void main(String[] args) {
// 基本算术运算
int a = 10, b = 3;
System.out.println("加法:" + (a + b)); // 输出 13
System.out.println("减法:" + (a - b)); // 输出 7
System.out.println("乘法:" + (a * b)); // 输出 30
System.out.println("除法(整型):" + (a / b)); // 输出 3(整型运算无小数)
System.out.println("除法(浮点型):" + (a / (double) b)); // 输出 3.333...(含小数)
System.out.println("取余:" + (a % b)); // 输出 1(余数)
// 除零情况对比
double c = 10.0;
// System.out.println(a / 0); // 整数除零,抛出 ArithmeticException: / by zero
System.out.println(c / 0); // 浮点数除零,输出 Infinity
System.out.println(0.0 / 0); // 特殊情况,输出 NaN
// 自增自减运算符
int d = 5;
System.out.println(d++); // 先使用后自增,输出 5,执行后 d=6
System.out.println(++d); // 先自增后使用,输出 7,执行后 d=7
System.out.println(d--); // 先使用后自减,输出 7,执行后 d=6
System.out.println(--d); // 先自减后使用,输出 5,执行后 d=5
}
}
关键注意点:
- 整型之间运算结果仍是整型,如需保留小数需先转浮点型
- 整数除零直接抛异常,浮点数除零返回特殊值(Infinity/Nan)
- 自增自减的前缀(++d)和后缀(d++)影响执行顺序,实际开发中尽量单独一行使用避免混淆
二、关系运算符:判断条件的核心
关系运算符用于比较两个值的关系,返回布尔值(true/false),常用于条件判断:
public class RelationDemo {
public static void main(String[] args) {
int x = 8, y = 8;
System.out.println("等于(==):" + (x == y)); // 输出 true
System.out.println("不等于(!=):" + (x != y)); // 输出 false
System.out.println("大于(>):" + (x > y)); // 输出 false
System.out.println("小于(<):" + (x < y)); // 输出 false
System.out.println("大于等于(>=):" + (x >= y)); // 输出 true
System.out.println("小于等于(<=):" + (x <= y)); // 输出 true
// 注意:引用类型比较地址,基本类型比较值
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // 输出 false(地址不同)
System.out.println(s1.equals(s2)); // 输出 true(值相同)
}
}
关键注意点:
- 基本类型用
==比较值,引用类型(如 String)用==比较内存地址,比较值需用equals()方法 - 关系运算符的结果只能是 true 或 false,不能直接赋值给非布尔变量
三、位运算符:直接操作二进制的高效工具
位运算符直接对整数的二进制位进行操作,效率极高,常用于底层开发或性能优化:
public class BitwiseDemo {
public static void main(String[] args) {
int m = 10; // 二进制:1010
int n = 6; // 二进制:0110
// 按位与(&):对应位都为1才为1
System.out.println("按位与:" + (m & n)); // 二进制 0010 → 输出 2
// 按位或(|):对应位有一个为1就为1
System.out.println("按位或:" + (m | n)); // 二进制 1110 → 输出 14
// 按位异或(^):对应位不同才为1
System.out.println("按位异或:" + (m ^ n)); // 二进制 1100 → 输出 12
// 按位非(~):按位取反(符号位也取反)
System.out.println("按位非:" + (~m)); // 结果为 -11(补码机制)
// 移位运算
System.out.println("左移2位(10<<2):" + (10 << 2)); // 10*2²=40
System.out.println("左移3位(10<<3):" + (10 << 3)); // 10*2³=80
System.out.println("右移2位(10>>2):" + (10 >> 2)); // 10/2²=2
System.out.println("右移2位(20>>2):" + (20 >> 2)); // 20/2²=5
System.out.println("无符号右移(-10>>>2):" + (-10 >>> 2)); // 忽略符号位右移
}
}
关键注意点:
- 移位运算本质是乘 / 除 2 的 n 次方,比直接用
*/效率更高 - 左移可能导致溢出,无符号右移(>>>)会把符号位当普通位处理(仅对整数有效)
- 按位非(~)运算结果遵循补码规则,正数取反后为负数
四、逻辑运算符:组合条件判断
逻辑运算符用于连接多个条件,返回布尔值,核心是短路特性:
public class LogicalDemo {
public static void main(String[] args) {
int num = 5;
// 逻辑与(&&):短路特性,第一个条件为false则不执行第二个
boolean condition1 = (num > 10) && (++num > 5);
System.out.println("逻辑与结果:" + condition1); // 输出 false
System.out.println("num值:" + num); // 输出 5(第二个条件未执行)
// 单与(&):无短路特性,无论第一个条件如何都执行第二个
boolean condition2 = (num > 10) & (++num > 5);
System.out.println("单与结果:" + condition2); // 输出 false
System.out.println("num值:" + num); // 输出 6(第二个条件已执行)
// 逻辑或(||):短路特性,第一个条件为true则不执行第二个
boolean condition3 = (num > 5) || (++num > 10);
System.out.println("逻辑或结果:" + condition3); // 输出 true
System.out.println("num值:" + num); // 输出 6(第二个条件未执行)
// 单或(|):无短路特性,无论第一个条件如何都执行第二个
boolean condition4 = (num > 5) | (++num > 10);
System.out.println("单或结果:" + condition4); // 输出 true
System.out.println("num值:" + num); // 输出 7(第二个条件已执行)
// 逻辑非(!):取反
boolean flag = true;
System.out.println("逻辑非结果:" + !flag); // 输出 false
}
}
关键注意点:
- 开发中优先使用短路运算符(&&、||),既能提高效率又能避免不必要的副作用
- 单与(&)、单或(|)仅在需要强制执行所有条件时使用(如同时判断多个表达式并执行副作用)
五、赋值运算符:变量赋值与简化写法
赋值运算符用于给变量赋值,支持直接赋值和复合赋值,注意类型转换问题:
public class AssignmentDemo {
public static void main(String[] args) {
// 基本赋值
int a = 10;
System.out.println("基本赋值:" + a); // 输出 10
// 复合赋值(等价于 a = a + 5,但更简洁)
a += 5;
System.out.println("加法赋值:" + a); // 输出 15
a -= 3;
System.out.println("减法赋值:" + a); // 输出 12
a *= 2;
System.out.println("乘法赋值:" + a); // 输出 24
a /= 4;
System.out.println("除法赋值:" + a); // 输出 6
// 类型转换注意点
short b = 10;
short c = 20;
// b = b + c; // 编译错误:b+c默认转为int,无法直接赋值给short
b += c; // 复合赋值会自动隐式转换,无编译错误
System.out.println("short类型复合赋值:" + b); // 输出 30
// 溢出问题
int maxInt = Integer.MAX_VALUE;
int overflow = maxInt + 1;
System.out.println("int溢出结果:" + overflow); // 输出 -2147483648(循环溢出)
}
}
关键注意点:
- 复合赋值(+=、-= 等)会自动进行隐式类型转换,避免编译错误
- 两个大整数运算可能导致溢出,需提前判断或使用更大类型(如 long)
六、三元运算符:简洁的条件判断
三元运算符是 if-else 的简化写法,语法:条件 ? 表达式1 : 表达式2,条件为 true 执行表达式 1,否则执行表达式 2:
public class TernaryDemo {
public static void main(String[] args) {
int score = 85;
// 判断成绩等级
String grade = score >= 90 ? "优秀" : (score >= 80 ? "良好" : "及格");
System.out.println("成绩等级:" + grade); // 输出 良好
// 求两个数的最大值
int num1 = 23, num2 = 45;
int maxNum = num1 > num2 ? num1 : num2;
System.out.println("最大值:" + maxNum); // 输出 45
// 注意:表达式1和表达式2类型需一致或可兼容
// String result = num1 > num2 ? num1 : "num2更大"; // 编译错误:类型不兼容
}
}
关键注意点:
- 三元运算符可以嵌套,但嵌套层数不宜过多(建议不超过 2 层),否则影响可读性
- 表达式 1 和表达式 2 的返回类型必须一致或可自动转换,否则编译报错
- 简单条件用三元运算符更简洁,复杂逻辑建议用 if-else
总结
Java 运算符看似基础,但用好、用对能让代码更简洁高效。核心要点总结:
- 算术运算注意整型 / 浮点型区别和除零问题
- 关系运算区分基本类型和引用类型的比较方式
- 位运算适合底层开发,移位运算效率高
- 逻辑运算优先用短路运算符,避免副作用
- 赋值运算注意类型转换和溢出
- 三元运算符简化简单条件判断,兼顾可读性
如果大家在实际使用中遇到运算符相关的坑,或者有其他疑问,欢迎在评论区留言交流~ 后续还会分享更多 Java 核心知识点,记得关注哦!



