Java基础知识总结之运算符

一、算术运算符

运算符 运算 范例 结果
+ 正号 +1 1
- 负号 -1 1
+ 2+3 5
- 5-2 3
* 2*5 10
/ 10/2 5
% 取模 5%3 2
++ 自增(前):先运算后取值 a=2;b=++a a=3;b=3
++ 自增(后):先取值后运算 a=2;b=a++ a=3;b=2
自减(前):先运算后取值 a=2;b=–a a=1;b=1
自减(后):先取值后运算 a=2;b=a– a=1;b=2
+ 字符串连接 “Ja”+“va” “Java”

注意:

  • /运算两个操作数都是整数时,为整数除法,否则,为浮点除法,例如15/2等于7,15.0/2等于7.5。整数/0将会产生一个异常,浮点数/0会得到无穷大或NAN。
  • %运算结果的符号和被模数相同。
  • 当String字符串与其他数据类型中间使用+号只能是做字符串连接运算,并且结果为String类型。

二、赋值运算符

运算符 运算 范例 结果
= 赋值 a=3,b=2 a=3,b=2
+= 加等于 a=3,b=2,a+=b a=5,b=2
-+ 减等于 a=3,b=2,a-=b a=1,b=2
*= 复合乘法的赋值运算 a=3,b=2,a*=b a=6,b=2
/= 除等于 a=3,b=2,a/=b a=1,b=2
%= 模等于 a=3,b=2,a%=b a=1,b=2

注意:如果复合赋值运算符得到一个值,其类型与左侧操作数类型不同,就会发生强制类型转换。例如x += 3.5;,如果x为int类型,则会将x设置为(int)(x + 3.5)

三、关系运算符(比较运算符)

运算符 运算 范例 结果
== 等于 7=5 false
!= 不等于 7!=5 true
< 小于 7<5 false
> 大于 7>5 true
<= 小于等于 7<=5 false
>= 大于等于 7>=5 true
instanceof 检查是否是类的对象 “Hello” instanceof String true

注意:

  • 比较运算符的结果都是布尔类型,要么为true,要么为false。
  • >、< 、>= 、<=只支持左右两边操作数是数值类型。
  • ==、 !=两边的操作数既可以是数值类型,也可以是引用类型。
  • 不要将关系运算符==写成=。

四、逻辑运算符

运算符 运算 范例 结果
& 逻辑与 false&true false
| 逻辑或 false|true true
^ 逻辑异或 true^false true
逻辑非 !true false
&& 短路与 false&&true false
|| 短路或 false||true true

运算法则如下:

a b a&b a|b a^b !a a&&b a||b
true true true true false false true true
true false false true true false false true
false true false true true true false true
false false false false false true false false

注意:

  • &与&&以及|与||的区别:
    • &:左边无论真假,右边都进行运算。
    • &&:如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
    • |:左边无论真假,右边都进行运算。
    • ||:如果左边为假,右边参与运算,如果左边为真,那么右边不参与运算。
  • 异或(^)与或(|)的不同之处是,当左右都为true时,结果为false。

五、位运算符

运算符 运算 范例 结果
<< 左移 3<<2 12(3*22
>> 右移 6>>2 1(6/22
>>> 无符号右移 3>>>1 1(3/2)
& 6&3 2
| 6|3 7
^ 异或 6^3 5
~ 反码 ~6 -7

<<(左移):空位补0,被移除的高位丢弃,空缺位补0。3<<2运算过程如下:

00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 000011 左移2位
00000000 00000000 00000000 00001100 低位补0,结果为12

<<的结果是乘以2的移动位数次幂。

>>:被移位的二进制最高位是0,右移后空缺位补0,最高位是1,空缺位补1。6>>2运算过程如下:

00000000 00000000 00000000 00000110 6
000000 00000000 00000000 00000001 右移2位
00000000 00000000 00000000 00000001 高位补0,结果为1

>>的结果是除以2的移动位数次幂。

>>>:被移位的二进制最高位无论是0还是1,空缺位都补0。-6>>>2运算过程如下:

11111111 11111111 11111111 11111010 -6
111111 11111111 11111111 11111110 右移2位
00111111 11111111 11111111 11111110 高位补0,结果为1073741822

&:二进制位进行&运算,参与运算的两位都为1,结果才是1,否则为0。6&3运算过程如下:

00000000 00000000 00000000 00000110 6
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000010 2

|:二进制位进行|运算,参与运算的两位都为0,结果才是0,否则为1。6|3运算过程如下:

00000000 00000000 00000000 00000110 6
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000111 7

^:二进制位进行^运算,参与运算的两位不同,结果才是1,否则为0。6^3运算过程如下:

00000000 00000000 00000000 00000110 6
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000101 5

~:二进制只有1和0,参与运算的位如果是1,取反为0,如果为0,取反为1。~6运算过程如下:

00000000 00000000 00000000 00000110 6
11111111 11111111 11111111 11111001 -7

当参与取反的数值是正数时,结果为把对应的值加上负号再-1;当参与取反的数值是负数时,结果为把对应的值加上负号再-1。

六、三元运算符(三目运算符)

格式:condition?:expression1:expression2;
condition为true,运算结果为expression1;条件表达式为false,运算结果为expression2。

注意:

  • 表达式1与表达式2的类型必须一致。
  • 2、使用三元运算符的地方一定可以使用if…else代替,反之不一定成立。

七、运算符优先级

Java基础知识总结之运算符

表中优先级序号1的优先级最高,优先级序号14的优先级最低。使用优先级为1的小括号可以改变其他运算符的优先级。