算术运算符
算术运算符用在数学表达式中,主要实现的是算术运算,如常见的加减乘除等。
表格中的例子中,变量 a
的值为 5,变量 b
的值为 3,变量 i
的值为 1:
算术运算符 | 名称 | 描述 | 类型 | 举例 |
---|---|---|---|---|
+ | 加法 | 相加运算符两侧的值 | 双目运算符 | a + b 等于 8 |
- | 减法 | 左操作数减去右操作数 | 双目运算符 | a - b 等于 2 |
* | 乘法 | 相乘操作符两侧的值 | 双目运算符 | a * b 等于 15 |
/ | 除法 | 左操作数除以右操作数 | 双目运算符 | a / b 等于 1 |
% | 取余 | 左操作数除右操作数的余数 | 双目运算符 | a % b 等于 2 |
++ | 自增 | 操作数的值增加 1 | 单目运算符 | ++i(或 i++) 等于 2 |
– | 自减 | 操作数的值减少 1 | 单目运算符 | –i(或 i–) 等于 0 |
其中,自增 (++) 和自减 (–) 运算符有两种写法:前缀(++i,–i)和后缀(i++,i–)。
- 前缀自增自减法 (++i,–i): 先进行自增或者自减运算,再进行表达式运算。
- 后缀自增自减法 (i++,i–): 先进行表达式运算,再进行自增或者自减运算。
位运算符
Java 定义了位运算符,应用于整数类型 (int
),长整型 (long
),短整型 (short
),字符型 (char
),和字节型 (byte
) 等类型。位运算时先转换为二进制,再按位运算。
表格中的例子中,变量 a
的值为 60(二进制:00111100
),变量 b
的值为 13(二进制:00001101
):
位运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
& | 按位与 | 都是 1,则结果为 1,否则为 0 | (a&b) 得到 12 即 0000 1100 |
丨 | 按位或 | 都是 0,则结果为 0,否则为 1 | (a 丨 b ) 得到 61 即 0011 1101 |
^ | 按位异或 | 值相同,则结果为 0,否则为 1 | (a^b) 得到 49 即 0011 0001 |
~ | 按位补/取反 | 0 变成 1,1 变成 0 | (~a) 得到 -61 即 1100 0011 |
<< | 按位左移 | 按位左移 | a<<2 得到 240 即 1111 0000 |
>> | 按位右移 | 按位右移 | a>>2 得到 15 即 1111 |
>>> | 无符号右移 | 按位右移,空位以零填充 | a>>>2 得到 15 即 0000 1111 |
1、<< 左移
3 << 2 = 12
问:4*8的最快方式:4 << 3
2、>> 右移
8 >> 2 = 2
3、>>> 无符号右移
4、& 按位与运算 0 & 0 = 0,0 & 1 = 1,1 & 0 = 0,1 & 1 = 1
5、| 按位或运算 0 | 0 = 0,0 | 1 = 1,1 | 0 = 1,1 | 1 = 1
6、^ 按位异或运算,相同为0不同为1 0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0
7、~ 取反
逻辑运算符
逻辑运算符是通过运算符将操作数或等式进行逻辑判断的语句。
表格中的例子中,假设布尔变量 a
为真(true
),变量 b
为假(false
):
逻辑运算符 | 名称 | 描述 | 类型 | 举例 |
---|---|---|---|---|
&& 或 & | 与 | 都为真,条件才为真 | 双目运算符 | (a && b) 或 (a & b) 为假 |
|| 或 | | 或 | 任何一个为真,条件为真 | 双目运算符 | (a || b) 或 (a | b) 为真 |
! | 非 | 用来反转操作数的逻辑状态 | 单目运算符 | (!a)为假 |
^ | 异或 | 两个操作数不同,条件为真 | 双目运算符 | (a ^ b) 为真 |
&&
与 ||
是具有短路性质,当按优先级顺序计算到当前表达式时,表达式的结果可以确定整个表达式的结果时,便不会继续向后进行判断和计算,而直接返回结果。
例如:当使用 &&
逻辑运算符时,在两个操作数都为 true
时,结果才为 true
,但是当得到第一个操作为 false
时,其结果就必定是 false
,这时候就不会再判断第二个操作了。在计算表达式 (a & b) && (a | b)
时,首先计算 a & b
得到了 false
,因为之后是 &&
,任何值与 false
进行与操作都是 false
,所以可以不用再计算下去,而直接返回 a & b
的结果 false
。
关系运算符
关系运算符生成的是一个 boolean
(布尔)结果,它们计算的是操作数的值之间的关系。如果关系是真实的,结果为 true
(真),否则,结果为 false
(假)。
表格中的例子中,假设变量 a
为 3,变量 b
为 5:
比较运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
== | 等于 | 若两个操作数相等,则条件为真 | (a == b) 为 false |
!= | 不等于 | 若两个操作数的值不相等,则条件为真 | (a != b) 为 true |
> | 大于 | 若左操作数大于右操作数,则条件为真 | (a > b) 为 false |
< | 小于 | 若左操作数小于右操作数,则条件为真 | (a < b) 为 true |
>= | 大于等于 | 若左操作数大于或等于右操作数,则条件为真 | (a >= b) 为 false |
<= | 小于等于 | 若左操作数小于或等于右操作数,则条件为真 | (a <= b) 为 true |
除了上表列出的二元运算符,Java 还有唯一的一个三目运算符 ?:
。
语法格式:
布尔表达式 ?表达式 1 : 表达式 2;
运算过程:如果布尔表达式的值为 true
,则返回表达式 1的值,否则返回表达式 2的值。
强调:
==
和!=
适用于所有的基本数据类型,其他关系运算符不适用于boolean
,因为boolean
值只有true
和false
,比较没有任何意义。==
和!=
也适用于所有对象,可以比较对象的引用是否相同。
引用:Java 中一切都是对象,但操作的标识符实际是对象的一个引用。
运算符优先级
运算符的优先级是帮助我们在一个表达式中如何对于不同的运算符和相同的运算符,进行正确的运算顺序。
运算符的优先级不需要特别地去记忆它,比较复杂的表达式一般使用圆括号 ()
分开,提高可读性。
优先级 | 运算符 | 结合性 |
---|---|---|
1 | [ ] . ( ) (方法调用) | 从左向右 |
2 | ! ~ ++ – +(一元运算符) -(一元运算符) ( )(强制类型转换) new | 从右向左 |
3 | * / % | 从左向右 |
4 | + - | 从左向右 |
5 | << >> >>> | 从左向右 |
6 | < <= > >= instanceof | 从左向右 |
7 | == != | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | = += -= *= /= %= &= |= ^= <<= >>= >>>= | 从右向左 |
1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3±4,则意义为3加-4,符号首先和运算符右侧的内容结合。
3、 instanceof 作用是判断对象是否为某个类或接口类型
4、 注意区分正负号和加减号,以及按位与和逻辑与的区别