前言
Java提供了非常丰富的运算符来对变量进行计算。我们可以把这些运算符分为下面几类:
- 算术运算符
- 关系运算符
- 按位运算符
- 逻辑运算符
- 赋值运算符
- 杂项运算符
算术运算符
算术运算符用于数学表达式中,和代数中的用法一样。
下面表格中列出了算数运算符计算的例子,其中假设变量A的值是10,变量B的值是20。
运算符 | 说明 | 举例 |
---|---|---|
+ (加) | 将符号左右两侧的数值进行相加 | A + B = 30 |
- (减) | 左右进行相减 | A - B = -10 |
* (乘) | 乘法运算 | A * B = 200 |
/ (除) | 除法运算 | B / A = 2 |
% (模取) | 计算左右相除的余数 | B % A = 0 |
++ (自加) | 将值加1 | B++ = 21 |
– (自减) | 将值减1 | B-- = 19 |
关系运算符
下面表格中列出了Java中的关系运算符,同样假设变量A的值是10,变量B的值是20。
运算符 | 描述 | 举例 |
---|---|---|
== (等于) | 判断两边是否相等,如果相等返回true,否则返回false。 | (A == B) = false. |
!= (不等于) | 判断两边是否不相等,如果相等返回false,否则返回true。 | (A != B) = true |
> (大于) | 判断左边是否大于右边,如果是则返回true,否则返回false。 | (A > B) = false |
< (小于) | 判断左边是否小于右边,如果是则返回true,否则返回false。 | (A < B) = true |
>= (大于等于) | 判断左边是否大于或等于右边,如果是则返回true,否则返回false。 | (A >= B) = false |
<= (小于等于) | 判断左边是否小于或等于右边,如果是则返回true,否则返回false。 | (A <= B) = true |
按位运算符
Java定义了多种按位运算符,可以用与integer,int,long,short,char和byte数据类型。
按位运算符用于二进制比特位(bit)与比特位之间的计算。假设a=60,b=13,换算成二进制以后,其表示如下:
a = 0011 1100
b = 0000 1101
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
下表中列出了具体的按位运算符说明与计算示例:
运算符 | 描述 | 举例 |
---|---|---|
& (按位与) | 二进制与操作符,操作符两边都为1是得到1,否则得到0 | (A & B) 得到12,也就是二进制0000 1100 |
| (按位或) | 二进制或操作符,操作符两边至少有一边为1时得到1,否则得到0 | (A | B) 得到61,也就是0011 1101 |
^ (按位异或) | 二进制异或操作符,操作符有且只有一边为1时得到1,否则得到0 | (A ^ B) 得到49,也就是0011 0001 |
~ (按位补码) | 二进制补码运算符是一元的,具有“翻转”位的作用。 | (~A )得到-61也就是1100 0011,二进制补码形式。 |
<< (左移) | 二进制左移运算符。 左操作数的值向左移动右操作数指定的位数。 | A << 2 得到240,也就是二进制1111 0000 |
>> (右移) | 二进制右移运算符。 左操作数的值向右移动右操作数指定的位数。 | A >> 2得到15,也就是1111 |
>>> (0填充右移) | 右移零填充运算符。 左操作数的值向右移动右操作数指定的位数,并且移位后的值用零填充。 | A >>>2得到15,也就是0000 1111 |
逻辑运算符
下表中详细说明了逻辑运算符,其中假设A为true(真),B为false(假)。
运算符 | 描述 | 举例 |
---|---|---|
&& (逻辑与) | 逻辑与操作符。当操作符两边都为true时,表达式返回为true,否则为false。 | (A && B) 为 false |
|| (逻辑或) | 逻辑或操作符。当操作符两边至少有一边为true时,表达式返回true,否则返回false。 | (A |
! (逻辑非) | 逻辑非操作符。用于将表达式结果反转,例如表达式为true时,使用“非”运算后结果为false;当表达式为false时,使用“非”运算后结果为true。 | !(A && B) 为 true |
赋值运算符
下表中详细列举了Java中的赋值运算符。
操作符 | 说明 |
---|---|
= | 简单的等号赋值运算符。将等号右边的值赋给左边。 |
+= | 将运算符左右两边的值相加后得到的值,赋值给运算符左边的变量 |
-= | 将运算符左右两边的值相减后得到的值,赋值给运算符左边的变量 |
*= | 将运算符左右两边的值相乘后得到的值,赋值给运算符左边的变量 |
/= | 将运算符左右两边的值相除后得到的值,赋值给运算符左边的变量 |
%= | 将运算符左右两边的值取模后得到的值,赋值给运算符左边的变量 |
<<= | 将运算符左边的值左移右边的数值对应的位数后,赋值给运算符左边的变量 |
>>= | 将运算符左边的数值右移右边的数值对应的位数后,赋值给运算符左边的变量 |
&= | 将运算符左边的值与右边的值进行按位与操作后,将得到的值赋给左边的变量 |
^= | 将运算符左边的值与右边的值进行按位异或操作后,将得到的值赋给左边的变量 |
|= | 将运算符左边的值与右边的值进行按位或操作后,将得到的值赋给左边的变量 |
杂项运算符
除了上文中提及的运算符之外,Java还支持少量其它的运算符。
条件运算符(? :)
条件运算符也叫三元运算符。这个运算符由三个操作数组成,用于评估布尔表达式。条件表达式用来决定哪个值该被赋给变量,写法如下:
variable x = (expression) ? value if true : value if false
下面是一个应用的例子:
public class Test {
public static void main(String args[]) {
int a, b;
a = 10;
b = (a == 1) ? 20: 30;
System.out.println( "Value of b is : " + b );
b = (a == 10) ? 20: 30;
System.out.println( "Value of b is : " + b );
}
}
instanceof操作符
这个操作符仅用于对象的引用变量,用来检查对象是否是一种特定的类型(类的类型或接口类型)。instanceof的用法如下:
( Object reference variable ) instanceof (class/interface type)
如果左侧的变量是右侧的类/接口的变量引用,那么表达式就返回true。下面是一个使用的示例:
public class Test {
public static void main(String args[]) {
String name = "James";
boolean result = name instanceof String;
System.out.println( result );
}
}
程序运行结果输出如下:
true
如果要比较的对象是与右侧类型兼容,则此运算符表达式仍将返回true。下面是另外一个例子:
class Vehicle {}
public class Car extends Vehicle {
public static void main(String args[]) {
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println( result );
}
}
程序运行结果输出如下:
true
Java运算符的优先级
运算符优先级确定一个表达式中运算的分组和顺序,这将影响表达式的计算结果。部分运算符优先级高于其它运算符,例如,乘法运算符的优先级高于加法运算符。
举个例子,x = 7 + 3 * 2。在这个表达式中,x的计算结果为13而不是20,这是因为乘法运算符(*)比加法运算符(+)的优先级更高,所以首先计算3 * 2,然后再将这个计算结果与7相加。
下表中,运算符的优先级为从上到下依次递减,也就是第一行的运算符优先级最高,最后一行的运算符优先级最低。在同一个表达式中,运算符的优先级越高,就越先被计算。
类别 | 运算符 | 关联性 |
---|---|---|
后缀 | expression++ expression– | 从左到右 |
一元 | ++expression –-expression +expression –expression ~ ! | 从右到左 |
乘性 | * / % | 从左到右 |
累加 | + - | 从左到右 |
移位 | << >> >>> | 从左到右 |
关系型 | < > <= >= instanceof | 从左到右 |
相等 | == != | 从左到右 |
按位与 | & | 从左到右 |
按位异或 | ^ | 从左到右 |
按位或 | | | 从左到右 |
逻辑与 | && | 从左到右 |
逻辑或 | || | 从左到右 |
条件运算符 | ?: | 从右到左 |
赋值运算符 | = += -= *= /= %= ^= |= <<= >>= >>>= | 从右到左 |
本篇小结
更多交流,欢迎加群(584017112):