运算符是 Java 编程的基础构建块,它们允许我们对数据进行操作和计算。本文将全面介绍 Java 中的各种运算符,包括它们的分类、优先级、结合性以及实际应用示例。

一、运算符概述

Java 运算符可以分为以下几类:

  • 算术运算符
  • 赋值运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 三元运算符
  • 其他特殊运算符

二、算术运算符

1. 基本算术运算符

javapublic class ArithmeticOperators {public static void main(String[] args) {int a = 10, b = 3;// 加法System.out.println("a + b = " + (a + b)); // 13// 减法System.out.println("a - b = " + (a - b)); // 7// 乘法System.out.println("a * b = " + (a * b)); // 30// 除法System.out.println("a / b = " + (a / b)); // 3 (整数除法)// 取模(求余)System.out.println("a % b = " + (a % b)); // 1// 浮点数除法double x = 10.0, y = 3.0;System.out.println("x / y = " + (x / y)); // 3.333...}}

2. 自增自减运算符

javapublic class IncrementDecrement {public static void main(String[] args) {int num = 5;// 前缀自增System.out.println(++num); // 6 (先增加后使用)// 后缀自增System.out.println(num++); // 6 (先使用后增加)System.out.println(num);   // 7// 前缀自减System.out.println(--num); // 6 (先减少后使用)// 后缀自减System.out.println(num--); // 6 (先使用后减少)System.out.println(num);   // 5}}

三、赋值运算符

javapublic class AssignmentOperators {public static void main(String[] args) {int a = 10;// 简单赋值int b = a;System.out.println("b = " + b); // 10// 复合赋值a += 5; // 等价于 a = a + 5System.out.println("a += 5 → " + a); // 15a -= 3; // 等价于 a = a - 3System.out.println("a -= 3 → " + a); // 12a *= 2; // 等价于 a = a * 2System.out.println("a *= 2 → " + a); // 24a /= 4; // 等价于 a = a / 4System.out.println("a /= 4 → " + a); // 6a %= 5; // 等价于 a = a % 5System.out.println("a %= 5 → " + a); // 1}}

四、关系运算符

javapublic class RelationalOperators {public static void main(String[] args) {int x = 10, y = 20;// 等于System.out.println("x == y: " + (x == y)); // false// 不等于System.out.println("x != y: " + (x != y)); // true// 大于System.out.println("x > y: " + (x > y));   // false// 小于System.out.println("x < y: " + (x < y));   // true// 大于等于System.out.println("x >= y: " + (x >= y)); // false// 小于等于System.out.println("x <= y: " + (x <= y)); // true// 对象比较 (比较引用)String s1 = new String("Hello");String s2 = new String("Hello");System.out.println("s1 == s2: " + (s1 == s2)); // falseSystem.out.println("s1.equals(s2): " + s1.equals(s2)); // true}}

五、逻辑运算符

javapublic class LogicalOperators {public static void main(String[] args) {boolean a = true, b = false;// 逻辑与System.out.println("a && b: " + (a && b)); // false// 逻辑或System.out.println("a || b: " + (a || b)); // true// 逻辑非System.out.println("!a: " + (!a)); // falseSystem.out.println("!b: " + (!b)); // true// 短路特性示例int x = 5, y = 10;if (x > 0 && y++ > 5) {// 由于x>0为true,会继续计算y++>5// y的值会改变}System.out.println("y after &&: " + y); // 11x = 0; y = 10;if (x > 0 & y++ > 5) {// 使用单个&会计算两边表达式// 即使x>0为false,y++也会执行}System.out.println("y after &: " + y); // 11}}

六、位运算符

javapublic class BitwiseOperators {public static void main(String[] args) {int a = 5; // 0101int b = 3; // 0011// 按位与System.out.println("a & b: " + (a & b)); // 1 (0001)// 按位或System.out.println("a | b: " + (a | b)); // 7 (0111)// 按位异或System.out.println("a ^ b: " + (a ^ b)); // 6 (0110)// 按位取反System.out.println("~a: " + (~a)); // -6 (补码表示)// 左移位System.out.println("a << 1: " + (a << 1)); // 10 (1010)// 右移位System.out.println("a >> 1: " + (a >> 1)); // 2 (0010)// 无符号右移位System.out.println("-1 >>> 1: " + (-1 >>> 1)); // 2147483647// 实际应用:快速乘以2的幂int num = 7;System.out.println("num * 8: " + (num << 3)); // 56}}

七、三元运算符

javapublic class TernaryOperator {public static void main(String[] args) {int x = 10, y = 20;// 基本用法int max = (x > y) ? x : y;System.out.println("Max: " + max); // 20// 嵌套三元运算符int a = 5, b = 10, c = 15;int largest = (a > b) ? (a > c ? a : c) : (b > c ? b : c);System.out.println("Largest: " + largest); // 15// 实际应用:条件赋值String result = (x % 2 == 0) ? "Even" : "Odd";System.out.println(x + " is " + result); // 10 is Even}}

八、其他特殊运算符

1. instanceof 运算符

javapublic class InstanceOfOperator {public static void main(String[] args) {Object str = "Hello";System.out.println("str instanceof String: " + (str instanceof String)); // trueSystem.out.println("str instanceof Integer: " + (str instanceof Integer)); // false// 父类实例检查Number num = 10;System.out.println("num instanceof Number: " + (num instanceof Number)); // trueSystem.out.println("num instanceof Integer: " + (num instanceof Integer)); // true}}

2. 类型转换运算符

javapublic class CastOperator {public static void main(String[] args) {// 自动类型转换double d = 10.5;int i = (int) d; // 显式类型转换System.out.println("Double: " + d + ", Int: " + i); // 10.5, 10// 向上转型 (自动)long l = 100L;float f = l;System.out.println("Float: " + f); // 100.0// 向下转型 (需要显式转换)double pi = 3.14159;int intPi = (int) pi;System.out.println("intPi: " + intPi); // 3// 窄化转换可能导致数据丢失int largeNum = 130;byte smallNum = (byte) largeNum;System.out.println("smallNum: " + smallNum); // -126 (溢出)}}

3. 方法调用运算符

javapublic class MethodCallOperator {static int add(int a, int b) {return a + b;}public static void main(String[] args) {// 方法调用实际上也是运算符int sum = add(5, 3); // 方法调用运算符System.out.println("Sum: " + sum); // 8// 对象方法调用String s = "Hello";int length = s.length(); // 方法调用System.out.println("Length: " + length); // 5}}

九、运算符优先级与结合性

Java 运算符的优先级从高到低如下:

优先级

运算符类别

运算符

结合性

1

后缀

() [] . (方法调用)

左到右

2

一元

++ -- ! ~ +(正) -(负)

右到左

3

乘除

* / %

左到右

4

加减

+ -

左到右

5

位移

<< >> >>>

左到右

6

关系

< > <= >= instanceof

左到右

7

相等

== !=

左到右

8

位与

&

左到右

9

位异或

^

左到右

10

位或

|

左到右

11

逻辑与

&&

左到右

12

逻辑或

||

左到右

13

三元

?:

右到左

14

赋值

= += -= *= /= %= &= ^= |= <<= >>= >>>=

右到左

优先级示例

javapublic class OperatorPrecedence {public static void main(String[] args) {int a = 10, b = 5, c = 2, d = 1;// 优先级示例1: * 比 + 优先级高int result1 = a + b * c; // 等价于 a + (b * c)System.out.println("a + b * c = " + result1); // 20// 优先级示例2: && 比 || 优先级高boolean bool1 = true, bool2 = false, bool3 = true;boolean result2 = bool1 || bool2 && bool3; // 等价于 bool1 || (bool2 && bool3)System.out.println("bool1 || bool2 && bool3 = " + result2); // true// 使用括号明确优先级int result3 = (a + b) * c; // 30System.out.println("(a + b) * c = " + result3);}}

十、最佳实践与注意事项

  1. 使用括号明确优先级:即使知道优先级规则,使用括号可以提高代码可读性
java// 不推荐if (a & b == c) {...}// 推荐if (a && (b == c)) {...}
  1. 避免过度使用复杂表达式:复杂的表达式可能降低代码可读性
java// 不推荐if ((x > 0 && y < 10) || (z == 100 && !flag) && !(count++ > 10)) {...}// 推荐拆分boolean condition1 = x > 0 && y < 10;boolean condition2 = z == 100 && !flag;boolean condition3 = count++ > 10;if (condition1 || (condition2 && !condition3)) {...}
  1. 注意短路行为&& 和 || 是短路的,& 和 | 不是
java// 可能导致空指针异常if (str != null & str.length() > 0) {...}// 更安全的写法if (str != null && str.length() > 0) {...}
  1. 避免在浮点数比较中使用 ==:由于精度问题,浮点数比较应使用误差范围
javadouble d1 = 0.1 + 0.2;double d2 = 0.3;// 不推荐// if (d1 == d2) {...}// 推荐if (Math.abs(d1 - d2) < 0.00001) {...}
  1. 位运算符使用场景:位运算符通常用于底层编程、加密算法或性能优化场景,业务逻辑中较少使用

十一、总结

Java 运算符是编程的基础,掌握它们的使用对于编写高效、正确的代码至关重要。本文涵盖了:

  • 所有主要运算符类别及其用法
  • 运算符优先级和结合性规则
  • 实际应用示例和最佳实践
  • 常见陷阱和注意事项

通过理解这些概念,你将能够编写更清晰、更高效的 Java 代码。记住,运算符不仅仅是语法元素,它们是表达程序逻辑的重要工具。