Java运算符:
优先级 | 运算符分类 | 结合顺序 | 运算符 |
由 高 到 低 | 分隔符 | 左结合 | . [] ( ) ; , |
一元运算符 | 右结合 | ! ++ -- - ~ | |
算术运算符 移位运算符 | 左结合 | * / % + - << >> >>> | |
关系运算符 | 左结合 | < > <= >= instanceof(Java 特有) = = != | |
逻辑运算符 | 左结合 | ! && || ~ & | ^ | |
三目运算符 | 右结合 | 布尔表达式?表达式1:表达式2 | |
赋值运算符 | 右结合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
一、一元运算符
因操作数是一个,故称为一元运算符。
运算符 | 含义 | 例子 |
- | 改变数值的符号,取反 | -x(-1*x) |
~ | 逐位取反,属于位运算符 | ~x |
++ | 自加1 | x++ |
-- | 自减1 | x-- |
++x 因为++在前,所以先加后用。
x++ 因为++在后,所以先用后加。
二、算术运算符
所谓算术运算符,就是数学中的加、减、乘、除等运算。因算术运算符是运算两个操作符,故又称为二元运算符。
运算符 | 含义 | 例子 |
+ | 加法运算 | x+y |
- | 减法运算 | x-y |
* | 乘法运算 | x*y |
/ | 除法运算 | x/y |
% | 取模运算(求余运算) | x%y |
数字精确问题(例子):
5+5.0=10.0
5-5.0=0.0
5*5.0=25.0
22/5=4
22%5=2
22/5.0=4.4
22%5.0=2.0
三、移位运算符
移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。
运算符 | 含义 | 例子 |
<< | 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) | x<<3 |
>> | "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. | x>>3 |
>>> | "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. | x>>>3 |
注:x<<y 相当于 x*2y ;x>>y相当于x/2y
从计算速度上讲,移位运算要比算术运算快。
如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。
四、关系运算符
Java具有完备的关系运算符,这些关系运算符同数学中的关系运算符是一致的。具体说明如下:
运算符 | 含义 | 例子 |
< | 小于 | x<y |
> | 大于 | x>y |
<= | 小于等于 | x<=y |
>= | 大于等于 | x>=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例。操作符左边的操作元是一个引用类型,右边的操作元是一个类名或者接口,形式如下:
obj instanceof ClassName 或者 obj instanceof InterfaceName
关系运算符产生的结果都是布尔型的值。
需要注意的是:关系运算符中的"=="和"!="既可以操作基本数据类型,也可以操作引用数据类型。
操作引用数据类型时,比较的是引用的内存地址。所以在比较非基本数据类型时,应该使用equals方法。
五、逻辑运算符
A | !A |
true | false |
false | true |
A | B | A&&B |
false | false | false |
true | false | false |
false | true | false |
true | true | true |
A | B | A||B |
false | false | false |
true | false | true |
false | true | true |
true | true | true |
位运算是对整数的二进制位进行相关操作,详细运算如下:
A | ~A |
1 | 0 |
0 | 1 |
A | B | A&B |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
A | B | A | B |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
A | B | A^B |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |