Java 运算符
Java运算符,是一些特殊的符号,它们对一个或者多个操作数执行特定的运算,然后返回一个结果
我们可以将Java运算符分为以下几类
-
算术运算符
-
关系运算符
-
位运算符
-
逻辑运算符
-
赋值运算符
-
其他运算符
下面分别来讲解这几种运算符
1 算术运算符
算术运算符和数学中的运算符的作用是一样的,下面列出了所有的算术运算符
假如 a = 20 , b = 10 , 如下:
| 操作符 | 描述 | 例子 |
|---|---|---|
| + | 加法 :相加运算符两侧的值 | a + b 等于 30 |
| - | 减法 :左操作数减去右操作数 | a – b 等于 10 |
| ***** | 乘法 :相乘操作符两侧的值 | a * b等于 200 |
| / | 除法 :左操作数除以右操作数 | a / b 等于 2 |
| % | 取余 :左操作数除以右操作数的余数 | a % b 等于 0 |
| ++ | 自增 :操作数的值增加1 | b++ 或 ++b 等于 11(区别详见下文) |
| -- | 自减 : 操作数的值减少1 | b-- 或 --b 等于 9(区别详见下文) |
示例1:
public class HelloWorld { public static void main(String[] args){ int a = 6; int b = 2; int c = 5; System.out.println( a + b ); //输出 8 System.out.println( a - b ); //输出 4 System.out.println( a * b ); //输出 12 System.out.println( a / b ); //输出 3 System.out.println( a % b ); //输出 0 System.out.println( a % c ); //输出 1 } }
下面讲讲 a++ 和 ++a的区别
-
a++变量名在前面,++在后面:意思就是 先使用a, 再对a进行自增操作 -
++a变量名在后面,++在前面:意思就是 先对a自增操作,再使用a
--操作符和++类似
举例说明:
示例2:
public class HelloWorld { public static void main(String[] args){ int a = 6; int b = 6; System.out.println( a++ ); // 输出 6 - 先使用 a ,也就是先打印 a 打印完 a 的值后,再对 a 进行自增 System.out.println( a ); // 输出 7 System.out.println( ++b ); // 输出 7 - 先对 b 自增,再打印,所以输出 7 System.out.println( b ); // 输出 7 } }
2 关系运算符
关系运算符也称为比较运算符,比如 大于 ,小于,等于,不等于 ....
比较的结果是一个布尔值(true或者 false)
下表列出了关系运算符 , 假如 a = 2, b = 3
| 运算符 | 描述 | 例子 (a = 2, b = 3) |
|---|---|---|
| == | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (a == b)为 false |
| != | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (a != b) 为 true |
| > | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (a > b)为 false |
| < | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (a < b)为 true |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (a >= b)为 false |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (a <= b)为 true |
示例:
public class HelloWorld { public static void main(String[] args) { int a = 2; int b = 3; System.out.println( a == b ); // 输出 false System.out.println( a != b ); // 输出 true System.out.println( a > b ); // 输出 false System.out.println( a < b ); // 输出 true System.out.println( a >= b ); // 输出 false System.out.println( a <= b ); // 输出 true } }
注意:比如两个值是否相等,是
==,两个等号,不是一个等号,一个等号的=是赋值运算符,后面会讲到
3 位运算符
Java语言提供了对整型类型的数值进行位操作称作位运算符
位运算符在实际的编码中,运用的不是很多,但是在有些场合下使用的话,能提高代码的效率
假如 a = 75 , b = 24 , 对应的二进制如下
a = 75 <==> 0100 1011
b = 24 <==> 0001 1000
如下表
| 操作符 | 描述 | 例子 |
|---|---|---|
| & | 如果相对应位都是1,则结果为1,否则为0
|
(a & b),得到12,即 0000 1000 |
| | | 如果相对应位都是 0,则结果为 0,否则为 1
|
(a | b ) , 得到 91 , 即 0101 1011 |
| ^ | 如果相对应位值相同,则结果为0,否则为1
|
(a ^ b), 得到 83,即 0101 0011 |
| 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 |
(〜a), 得到 -76,即 -100 1100 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | a << 2 , 得到 300,即 1011 1011 1000 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | a >> 2, 得到18, 即 0001 0010 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | a>>>2 , 得到 18, 即 0001 0010 |
4 逻辑运算符
Java的逻辑运算符包括 && , || , ! ,
下面表格列出, 其中 a = true, b = false
| 运算符 | 描述 | 例子 (a = true, b = false) |
|---|---|---|
| &&(与) | 当且仅当两个操作数都为真,条件才为真。只要有一个为假,则条件为假 | ( a && b )为 false
|
| ||(或) | 或操作符。其中只要有一个操作数为真是,条件为真。只有所有操作数都为假,条件为假 | ( a || b )为 true
|
| !(非) | 非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | ! a 为 false
|
示例:
public class HelloWorld { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println( a && b ); //输出 false System.out.println( a || b ); //输出 true System.out.println( !a ); //输出 false } }
短路逻辑运算符
当使用 && 或者 || 这两个运算符时,只要第一个操作能决定整个结果时,其它的操作数就不会再执行了。
-
&&的短路当
a = true, b = false, 则b && a为 false因为 && 运算符,2 个(也可以 2 个以上)都为真是,才为真
只要有一个为假,则为假
所以上面的
b && a,第一个操作数b为false,则整个条件肯定是假,后面的操作数就不会再判断 a 了 -
||的短路当
a = true, b = false,则a || b为 true因为 || 运算符,只要有一个为真,则条件为 true
所以
a || b, 只判断a的值 ,b的值不再判断了因为
a为true,就决定了整个条件为true
下面的示例能更清楚的演示这个问题:
示例1 :演示 && 的短路
public class HelloWorld { private boolean a = true; private boolean b = false; boolean getA(){ System.out.println("打印了 a "); return a; } boolean getB(){ System.out.println("打印了 b "); return b; } public static void main(String[] args) { HelloWorld hello = new HelloWorld(); // getB() && getA() ,因为 getB() 为 false,决定了整个条件为 false // 所以后面的 getA()方法就不再执行了,“打印了 a” 这句话也不会输出了 System.out.println( hello.getB() && hello.getA() ); } }
输出如下:
打印了 b false
示例2:演示 ||的短路
public class HelloWorld { private boolean a = true; private boolean b = false; boolean getA(){ System.out.println("打印了 a "); return a; } boolean getB(){ System.out.println("打印了 b "); return b; } public static void main(String[] args) { HelloWorld hello = new HelloWorld(); // getA() && getB() ,因为 getA() 为 true,决定了整个条件为 true // 所以后面的 getB()方法就不再执行了,“打印了 b” 这句话也不会输出了 System.out.println( hello.getA() || hello.getB() ); } }
输出如下:
打印了 a true
5 赋值运算符
Java赋值运算符,顾名思义,就是给变量赋值的。下面是Java的支持的赋值运算符
下面表格中,int a = 10, int b = 20
| 操作符 | 描述 | 例子 |
|---|---|---|
| = | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | int c = a + b , 把 a + b 的值 赋值给 c ,此时 c = 30 |
| += | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | a += b 等价于 a = a + b ,此时 a = 30 |
| -= | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | a -= b 等价于 a = a - b , 此时 a = -10 |
| *= | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | a *= b 等价于 a = a * b ,此时 a = 200 |
| /= | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | b /= a 等价于 b = b / a , 此时 b = 2 |
| %= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | b %= a 等价于 b = b % a ,此时 b = 0 |
| <<= | 左移位赋值运算符 | a << = 2等价于 a = a << 2 |
| >>= | 右移位赋值运算符 | a >> = 2等价于a = a >> 2 |
| &= | 按位与赋值运算符 | a&= 2等价于a = C&2 |
| ^ = | 按位异或赋值操作符 | a ^ = 2等价于a = a ^ 2 |
| |= | 按位或赋值操作符 | a |= 2 等价于a = a |2 |
示例:
public class HelloWorld { public static void main(String[] args) { int a = 10; int b = 20; int c0 = a + b; // c0 = 30 int c1 = 3 ; c1 += a; // c1 = 13 int c2 = 13; c2 -= a; // c2 = 3 int c3 = 3; c3 *= a; // c3 = 30 int c4 = 20; c4 /= a; // c4 = 2; int c5 = 23; c5 %= a; // c5 = 3 int c6 = 0; c6 = a <<= 2; // c6 = 40 int c7 = 0; c7 = a >>= 2; // c7 = 10 int c8 = 0; c8 = a &= 2; // c8 = 2 int c9 =0; c9 ^= 2; // c9 = 2 int c10 = 0; c10 |= 2; // c10 = 2 } }
6 其它运算符
1 三目运算符 ?:
该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
一个简单的例子
public class HelloWorld { public static void main(String[] args) { //学生分数 int score = 75; //是否及格, 当分数大于60,isPass 就取true, 否则为 false boolean isPass = score > 60 ? true : false; System.out.println( isPass ); // 输出 true } }
语法如下:
variable x = (expression) ? value if true : value if false
再对着上面的例子,就容易理解了。
主要就是前面条件为真,就取 问号后面的值,否则,就取 冒号 后面的值
2 instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
object instanceof var ,返回的是一个boolean值
如下面示例:
public class HelloWorld { public static void main(String[] args) { Object obj = "www.helloworld.net"; //判断 obj 是否是 String 类型的变量 boolean b = obj instanceof String; System.out.println( b ); // 输出 true } }
7 Java运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级问题。
就算数学中的加减乘除一样,有加法有乘法,先算乘法,后算加法一样,有括号的先算括号的。
Java的运算符也是有一个优先级的。
下表按照优先级从高到低排列。如下:
| 类别 | 操作符 | 关联性 |
|---|---|---|
| 后缀 | () [] . (点操作符) | 左到右 |
| 一元 | expr++ expr-- | 从左到右 |
| 一元 | ++expr --expr + - ~ ! | 从右到左 |
| 乘性 | * / % | 左到右 |
| 加性 | + - | 左到右 |
| 移位 | >> >>> << | 左到右 |
| 关系 | >>= <<= | 左到右 |
| 相等,不等 | == != | 左到右 |
| 按位与 | & | 左到右 |
| 按位异或 | ^ | 左到右 |
| 按位或 | ||
| 逻辑与 | && | 左到右 |
| 逻辑或 | ||
| 条件 | ?: | 从右到左 |
| 赋值 | = + = - = * = / =%= >> = << =&= ^ = | = |
| 逗号 | , | 左到右 |
小结
Java的运算符有以下几种:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
运算符之间有优先级