一、Java运算符概览
1.1 Java运算符的分类
运算符可以理解为操作符,运算符根据操作数的不同,可以分为:
- 单目运算符
- 双目运算符
- 三目运算符
根据运算符的功能,可以分为:
运算符类型 | 包含的运算符 |
---|---|
算术运算符 | +、-、*、/、%、++、-- |
关系运算符 | >、<、>=、<=、==、!= |
逻辑运算符 | &(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或) |
赋值运算符 | =、+=、-=、*=、/=、%=、^=、&=、|=、<<=、>>=、>>>= |
位运算符 | &(按位与)、|(按位或)、^(按位异或、~(按位取反)、<<(左移)、>>(带符号右移)、>>>(无符号右移)) |
条件运算符 | 布尔表达式?表达式A: 表达式B |
字符串连接运算符 | + |
其他运算符 | instanceof、new |
1.2 Java运算符的优先级
二、算术运算符
2.1 算术运算符一览表
运算符 | 含义 |
---|---|
+ | 求和 |
- | 求差 |
* | 求积 |
/ | 求商 |
% | 求余数/取模 |
++ | 自增 |
-- | 自减 |
2.2 重点介绍 ++ 和 -- 运算符
++表示自加1,即在变量现在的值的基础上加上1,有两种形式,一种是“++”出现在变量的后面,一种是“++”出现在变量的前面。它们的区别是:
A、“++”出现在变量的后面表示先参与其他的运算,再将自身的值加1,举例说明:
int a = 100;
int b = a++; //先将a的值100赋给b,a再自加1变为101
System.out.println(a); //输出101
System.out.println(b); //输出100
//或者
int x = 20;
System.out.println(x++); //输出为20
System.out.println(x); //输出为21
B、“++”出现在变量前面表示先将变量本身的值自加1,再参与其他的运算,举例说明:
int a = 100;
int b = ++a; //a先自加1,再将其值赋给b
System.out.println(a); //输出为101
System.out.println(b); //输出为101
//或者
int x = 20;
System.out.println(++x); //输出为21
System.out.println(x); //输出为21
自减运算符“--”与自增遵循如上A、B相同的规则,在此不再赘述。
** 注意:自增运算符和自减运算符只能作用于变量,不能作用于字面量,例如,下面的赋值方法是不合法的:**
int x = 10++;
//或者
int y = --20;
思考题:执行完下面的代码,m和n分别是多少呢?
int m = 1;
int n = (++m) + (m++) +(--m) - (m--);
System.out.println(n);
System.out.println(m);
答案:
n = 4,m = 1
解析:
三、关系运算符
3.1 关系运算符一览表
运算符 | 含义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
3.2 关于关系运算符的两点说明
(1)关系运算符的运算结果只能是布尔类型(boolean),要么为true,要么为false;
(2)判断字符串是否相等不能用“==”运算符,应该用字符串的equals()方法,例如:
String s1 = "Hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); //输出为false
四、逻辑运算符
4.1 逻辑运算符一览表
运算符 | 含义 | 备注 |
---|---|---|
& | 逻辑与(双目) | 全真为真,有假即假(仍然计算全部表达式) |
| | 逻辑或(双目) | 全假为假,有真即真(仍然计算全部表达式) |
! | 逻辑非(单目) | 假变为真,真变为假 |
&& | 短路与(双目) | 全真为真,遇假结束运算 |
|| | 短路或(双目) | 全假为假,遇真结束运算 |
4.2 说明
(1)逻辑运算符除了逻辑非(取反)“~”为单目运算符之外,其余均为双目运算符,操作数是boolean类型的变量,操作结果也是boolean类型的,即要么为true,要么为fasle。
(2)注意逻辑与(逻辑或)和短路与(短路或)的区别
请看下面的代码:
//使用逻辑与(&)
int a = 20;
int b = 30;
System.out.println((a > b) & (a > b++)); //很明显输出为false
System.out.println(b); //b是多少呢?b变为了31,因为上面的b++被执行了
//使用短路与(&&)
int x = 20;
int y = 30;
System.out.println((x > y) && (x > y++)); //也是false
System.out.println(y); //这里,y仍为30,即上面的y++未被执行
可以看出,使用逻辑与(&)进行条件判断的时候,即使某个表达式已经为“假”了,但是后面的表达式仍然会被计算;而使用短路与(&&)的时候,如果遇到某个表达式的值为“假”,那么就不再计算后面的表达式。
五、赋值运算符
5.1 赋值运算符一览表
赋值运算符分为基本赋值运算符和扩展赋值运算符,如下表所示
类型 | 运算符 |
---|---|
基本赋值运算符 | = |
扩展赋值运算符 | +=、-=、*=、/=、%=、^=、&=、|=、<<=、>>= |
5.2 关于赋值运算符的几点说明
(1)要注意 x += 1 和 x = x + 1的区别
请看下面的代码
byte x = 10;
x = x + 1; //报错【错误: 不兼容的类型: 从int转换到byte可能会有损失】
上面的代码有错误是因为在计算 x = x + 1的时候,1 被视为int类型的,将其赋给 byte类型的x,所以会错误。
而下面的代码:
byte x = 10;
x += 1; //这样写没毛病Old iron
这样写是没问题的,因为在这里 x += 1 其实相当于 x = (byte)(x + 1),即使运算的结果超出 byte 的范围也不会报错,而是会发生溢出。
(2)使用扩展赋值运算符(+=、-=、*=、/=等等)不会改变变量的类型,但可能会造成精度的损失。
六、位运算符
6.1 位运算符一览表
运算符 | 含义 | 备注 |
---|---|---|
& | 按位与 | |
| | 按位或 | |
^ | 按位异或 | |
~ | 按位取反 | |
<< | 左移 | 低位填充0 |
>> | 带符号右移 | 高位填充符号位 |
>>> | 无符号右移 | 高位填充0 |
6.2 位运算符详解
以下面的代码为例进行详解
public class BitOperationTest{
public static void main(String[] args){
int a = 125; //0b 0000_0000_0111_1101(补码=原码)
int b = 365; //0b 0000_0001_0110_1101(补码=原码)
int c = -1283; //0b 1111_1010_1111_1101(补码)
// 十进制↓ 补码↓
System.out.println(a & b); //输出109, 0b 0110_1101
System.out.println(a & c); //输出125, 0b 0111_1101
System.out.println(a | b); //输出381, 0b 0000_0001_0111_1101
System.out.println(a | c); //输出-1283,0b 1111_1010_1111_1101
System.out.println(a ^ b); //输出272, 0b 0000_0001_0001_0000
System.out.println(a ^ c); //输出-1408,0b 1111_1010_1000_0000
System.out.println(~a); //输出-126, 0b 1111_1111_1000_0010
System.out.println(~c); //输出1282, 0b 0000_0101_0000_0010
System.out.println(a << 3) ; //输出1000, 0b 0000_0011_1110_1000
System.out.println(a >> 3); //输出15, 0b 0000_0011_1110_1000
System.out.println(c >> 3); //输出-161, 0b 1111_1111_0101_1111
System.out.println(a >>> 3); //输出15, 0b 0000_0000_0000_1111
}
}
七、条件运算符
条件表达式的格式为:
布尔表达式? 表达式1 : 表达式2
当布尔表达式的值为 true 时,整个表达式的值为表达式1的值,否则,整个表达式取表达式2的值。
八、字符串连接运算符
加号 “+” 除了作为加法运算的运算符之外,还可以作为字符串连接运算符。
当 “+” 两边均为数值类型时,作为加法运算符;
当 “+” 任意一边为字符串类型时,作为字符串连接运算符。
那如果既有数值型也有字符串呢?这时会遵循从左到右的顺序依次运算,除非加圆括号改变运算的优先顺序,例如下面的代码:
int a = 100;
int b = 200;
String s = "Hello";
System.out.println(a + b + s); //先计算 a+b=300,再计算 300+"Hello",结果为"300Hello"
System.out.println(a + (b + s)); //先计算 b + s,结果为"200Hello",再计算 a + "200Hello",结果为"100200Hello"
//输出“100 + 200 = 300”
System.out.println(a + "+" + b + "=" + (a + b)); //输出"100 + 200 = 300"
//去掉小括号呢?
System.out.println(a + "+" + b + "=" + a + b); //输出"200 + 100 = 200100"