一、运算符分类
Java运算符分为以下几类:
类别 | 运算符 | 说明 |
---|---|---|
算术运算符 | + , - , * , / , % , ++ , -- | 数学运算,支持自增/自减 |
关系运算符 | == , != , > , < , >= , <= | 比较大小或相等性 |
逻辑运算符 | && , || , ! | 布尔逻辑运算,支持短路特性 |
位运算符 | & , | , ^ , ~ , << , >> , >>> | 二进制位操作(按位与、或、异或等) |
赋值运算符 | = , += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>= , >>>= | 赋值与运算结合 |
条件运算符 | ? : | 三元运算符,简化条件判断 |
类型检查 | instanceof | 判断对象是否属于某个类/接口 |
其他 | -> (Lambda表达式) | 用于函数式编程 |
二、算术运算符
基本运算:
-
+
,-
,*
,/
:加减乘除。 -
%
:取模(余数)。 -
++
/--
:自增/自减(前缀与后缀区别):
int a = 5;
int b = a++; // b=5, a=6(后缀:先赋值再自增)
int c = ++a; // c=7, a=7(前缀:先自增再赋值)
注意事项:
- 整数除法:结果自动舍弃小数部分。
int result = 10 / 3; // result=3
- 浮点数精度:运算可能产生舍入误差。
double d = 0.1 + 0.2; // d≈0.30000000000000004
三、关系运算符
-
返回布尔值(
true
或false
)。 -
示例:
int x = 10, y = 20;
boolean isEqual = (x == y); // false
boolean isGreater = (x > y); // false
四、逻辑运算符
(1) 基本操作:
-
&&
(逻辑与):全真为真,支持短路(左操作数为假时跳过右操作数)。 -
||
(逻辑或):一真即真,支持短路(左操作数为真时跳过右操作数)。 -
!
(逻辑非):取反。
(2) 短路特性示例:
boolean result = (false && (10/0 == 0)); // 不会抛出异常(右侧不执行)
五、位运算符
按位操作:
-
&
:按位与。 -
|
:按位或。 -
^
:按位异或(相同为0,不同为1)。 -
~
:按位取反。 -
<<
:左移(低位补0)。 -
>>
:右移(符号位填充)。 -
>>>
:无符号右移(高位补0)。
示例:
int a = 5; // 二进制 00000101
int b = a << 2; // b=20(二进制 00010100)
int c = a & 0b0011; // c=1(按位与)
六、赋值运算符
复合赋值:简化运算并赋值。
int x = 10;
x += 5; // 等价于 x = x + 5
x *= 2; // 等价于 x = x * 2
注意类型转换:
byte b = 10;
b += 5; // 合法(等价于 b = (byte)(b + 5))
b = b + 5; // 错误:需要强制转换(int→byte)
七、条件运算符(三元运算符)
-
语法:
条件 ? 表达式1 : 表达式2
-
示例:
int max = (a > b) ? a : b; // 返回较大的值
八、运算符优先级与结合性
运算符优先级从高到低(部分常见):
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () 、[] 、. (方法调用、数组访问) | 左→右 |
2 | ! 、~ 、++ 、-- 、+ (正)、- (负)、(类型) (强制转换) | 右→左 |
3 | * 、/ 、% | 左→右 |
4 | + 、- | 左→右 |
5 | << 、>> 、>>> | 左→右 |
6 | < 、<= 、> 、>= 、instanceof | 左→右 |
7 | == 、!= | 左→右 |
8 | & | 左→右 |
9 | ^ | 左→右 |
10 | | | 左→右 |
11 | && | 左→右 |
12 | || | 左→右 |
13 | ? : | 右→左 |
14 | = 、+= 、-= 等赋值运算符 | 右→左 |
示例:
int result = 5 + 3 * 2; // 3*2先计算,result=11
boolean flag = !(a > b) && (c != 0); // 先计算括号和!,再&&
九、表达式(Expression)
定义:
由变量、常量、运算符和方法调用组成的代码片段,最终返回一个值。
类型转换规则:
(1)自动类型提升:运算时小类型自动转为大类型。
int a = 10;
double b = 3.5;
double c = a + b; // int→double,结果为13.5
(2)强制类型转换:大类型→小类型需显式转换。
double d = 10.5;
int i = (int) d; // i=10(截断小数部分)
十、示例代码
public class OperatorsDemo {
public static void main(String[] args) {
// 算术运算符
int a = 10, b = 3;
System.out.println(a / b); // 3(整数除法)
System.out.println(a % b); // 1
// 逻辑运算符
boolean flag1 = true, flag2 = false;
System.out.println(flag1 && flag2); // false
System.out.println(flag1 || flag2); // true
// 位运算符
int x = 0b1010; // 10
int y = x << 1; // 20(二进制10100)
System.out.println(y);
// 三元运算符
int max = (a > b) ? a : b; // max=10
}
}