一、什么是运算符?
Java运算符是对常量或者变量进行操作的符号,通过不同的运算符可以获取到不同的结果。
二、运算符的分类
在Java中运算符可以分为六类,分别是:算数运算符、比较运算符、赋值运算符、逻辑运算符、位运运算符、三元运算符。
下面我一一来详解Java运算符。
三、算数运算符
算数运算符主要用于数学运算,与数学中的运算符相同。具体如下:
符号 |
含义 |
+ |
加法(或正号) |
– |
减法(或负号) |
* |
乘法 |
/ |
除法 |
% |
取余数(取模) |
++ |
自加1 |
— |
自减1 |
示例如下:
int a = 10; int b = 20; int c = 23; //算术运算符(加减乘除) System.out.println(a+b); System.out.println(a-b); System.out.println(a*b); System.out.println(a-c);
四、比较运算符
比较运算符通常用于变量之间信息的比较,其得到的结果是boolean类型。当比较运算符对应的关系成立时,得到的结果为true,否则为false。比较运算有6个,具体如下:
符号 |
含义 |
> |
比较左方的值是否大于右方的值 |
>= |
比较左方的值是否大于或等于右方的值 |
< |
比较左方的值是否小于右方的值 |
<= |
比较左方的值是否小于或等于右方的值 |
== |
比较左方的值是否等于右方的值 |
!= |
比较左方的值是否不等于右方的值 |
五、赋值运算符
赋值运算符的功能是将符号右边操作数得到的结果赋给符号左方的操作数。赋值运算符包括:
符号 |
含义 |
= |
将符号右边的值赋给符号左边的操作数 |
+= |
将符号左方和右方相加之后的结果再赋给符号左方 |
-= |
将符号左方和右方相减之后的结果再赋给符号左方 |
*= |
将符号左方和右方相乘之后的结果再赋给符号左方 |
/= |
将符号左方和右方相除之后的结果再赋给符号左方 |
%= |
将符号左方和右方取模之后的结果再赋给符号左方 |
…… |
六、逻辑运算符
逻辑运算符用来连接一个或多个能够得到boolean值的表达式,其返回的结果也是boolean类型。逻辑运算符总共有3个,分别是:&&(逻辑与)、||(逻辑或)、!(逻辑非)
逻辑与&&:当两个操作数的结果都为true时,其得到的结果就为true,否则结果为false
逻辑或||:当两个操作数的结果至少有一个为true时,其得到的结果为true,否则结果为false
逻辑非!:它是一元运算符,对操作数进行取反的操作。如果操作数的结果为true,那么最终结果为false;如果操作数的结果为false,那么最终的结果为true
逻辑与&& 和 逻辑或|| 也被称为“短路”运算符,之所以被称为“短路”运算符是根据其本身的特性决定的。
逻辑与&&:当左边的操作数的结果为false时,右边的表达式不会被执行,最终的结果为false
逻辑或|| :当左边的操作数的结果为true时,右边的表达式不会被执行,最终的结果为true
示例如下:
//逻辑预算法 与或非 && || ! boolean a = true; boolean b = false; //&&两个变量都是true 结果才会是true System.out.println("a&&b:"+(a&&b)); //两个变量只要一个为真,结果为真 System.out.println("a||b:"+(a||b)); //结果取反 System.out.println("!(a&&b):"+!(a&&b)); int c =5; boolean d = (c<3)&&(c++<4);//&&只要前面部分为假,就不会执行后面的部分 System.out.println(c); System.out.println(d);
七、位运算符
位运算符完全是针对二进制位进行操作的运算符,包括按位与(&)、按位或(|)、按位异或(^)、求反运算(~)、左移运算(<<)、右移运算(>>)
按位与(&)
按位与运算符的写法是一个”&”符号,表示如果两个输入位都是1,那么按位“与”(&)操作就会生成一个输出位1,否则生成一个输出位0,如下图所示:
按位或(|)
或运算符用符号“|”表示,其运算规律如下:
只要对应的两个二进制位有一个为1,结果就为1,否则就为0,如下图所示:
按位异或(^)
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,位相同则结果为0,不同则结果为1,如下图所示:
取反(~)
按位非(~)操作符,也称为取反操作符,它属于一元操作符。
只对一个数进行操作(其他按位操作符是二元操作符),按位“非”生成与输入位相反的值,若输入0,则输出1;若输入1,则输出0。
我们以数字5为例讲解按位取反的运算过程,如下图所示:
首先把数字5转换成补码形式,之后把每个二进制位上的数字进行取反,如果是0就变成1,如果1就变成0。
左移(<<)
左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。
其实,向左移n 位,就相当于乘上2 的n 次方,例如下面的例子。
public static void main(String[] args) { int a=2; int b=2; System.out.println("a 移位的结果是:"+(a<<b)); }
运行结果:a 移位的结果是:8
带符号右移(>>)
右移运算分为两种,分别是带符号右移和无符号右移,首先我们来说说带符号右移运算符。
带符号的右移运算符用符号“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1,先看下面一个简单的例子。
public static void main(String[] args) { int a=16; int c=-16; int b=2; int d=2; System.out.println("a 的移位结果:"+(a>>b)); System.out.println("c 的移位结果:"+(c>>d)); }
运行结果:
a 的移位结果:4
c 的移位结果:-4
分析上面的程序段:
a 的值是16,转换成二进制是00010000,让它右移两位成00000100 即4。
c 的值是-16,转换成二进制是11101111,让它右移一位成11111011 即-4。
无符号右移(>>>)
上面说了右移运算分为两种,分别是带符号右移和无符号右移,现在再来讲解无符号右移。
无符号右移运算符的写法是”>>>”,比带符号右移多了一个”>”。
右移运算符用符号“>>>”表示,是将运算符左边的对象向右移动运算符右边指定的位数,并且在高位补0,其实右移n 位,就相当于除上2 的n 次方。
public static void main(String[] args) { int a=16; int b=2; System.out.println("a 移位的结果是:"+(a>>>b)); }
运行结果
a 移位的结果是:4
分析上面的程序段:从本质上来分析,16 的二进制是00010000,它向右移动2 位,就变成了00000100,即4。
如果从另一个角度来分析,它向右移动2 位,其实就是除以2 的2 次方,结果还是4。
八、三元运算符
三元运算符的语法格式:
result = <expression> ? <statement1> : <statement3>;
其中,expression 是一个布尔表达式,当 expression 为真时,执行 statement1, 否则就执行 statement3。
此三元运算符要求返回一个结果,因此要实现简单的二分支程序,即可使用该条件运算符。
示例如下:
int a =10,b = 20 ; System.out.println(a>b?a:b);
九、运算符优先级
java中的表达式往往会出现多个种类的运算符,运算符的优先级决定了表达式中运算的先后顺序以及最终结果。通常优先级由高到低的顺序为:
自增/自减 > 算数运算 > 比较运算 > 逻辑运算 > 赋值运算
如果出现了两个运算符号具有相同的优先级,此时按照从左到右的顺序进行运算。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》