一、算术运算符
+:加法运算符
-:减法运算符
*:乘法运算符
/:除法运算符
说明两点:(1)如果除法运算符两个操作数都是整数类型,则计算结果也是整数。当被除数位为整数时,此时除数不能为0,否则会引起异常。
1 jshell> 19/7 2 $1 ==> 2 3 4 jshell> 4/0 5 | 异常错误 java.lang.ArithmeticException:/ by zero 6 | at (#2:1)
(2)如果出发运算的两个操作数有一个为浮点数时。则计算结果也是浮点数(自动转换)。此时除数可以为0或0.0,得到的结果为无穷大。
1 jshell> 5/2 2 $1 ==> 2 3 4 jshell> 5.0/2 5 $2 ==> 2.5 6 7 jshell> 5.0/0 8 $3 ==> Infinity 9 10 jshell> 0.0/0 11 $4 ==> NaN 12 13 jshell> 0.0/0.0 14 $5 ==> NaN 15 16 jshell>
%求余运算符
它的计算结果是使用第一个操作数除以第二个操作数,得到一个整数的结果后剩下的值就是余数。求余运算符的第二个操作数不能为0,若是求余运算符的两个操作数有一个为浮点数时,则允许第二个操作数为0或0.0,只是求余的结果是非数。
1 jshell> 4%3 2 $1 ==> 1 3 4 jshell> 5.2%2 5 $2 ==> 1.2000000000000002 6 7 jshell> 2.0%0 8 $3 ==> NaN 9 10 jshell>
++:自加/--:自减
注意:(1)自加/自减放在变量前后会有区别;
1 class 自加自减 2 { 3 public static void main(String[] args) 4 { 5 int a=10; 6 System.out.println(a++);//,先输出,后自加,输出为10 7 int b=20; 8 System.out.println(--b);//先自减,后输出,输出为19 9 } 10 }
(2)自加和自减只能操作变量,不能用于操作数值的直接量、常量和表达式。例如:5++、6--等用法错误
二、位运算符
一般来说,位操作符只能操作整数类型(默认为int类型变量 32位)的变量或值
2.1 位逻辑运算符
运算符 | 含义 | 单目/双目运算符 | 实例 |
& | 与 | 双目运算符 | 4&5=4 |
| | 或 | 双目运算符 | 4|5=5 |
^ | 异或 | 双目运算符 | 4^5=1 |
~ | 非 | 单目运算符 | ~4=-5 |
1 class 位逻辑运算符 2 { 3 public static void main(String[] args) 4 { 5 System.out.println(5&4); 6 System.out.println(5|4); 7 System.out.println(5^4); 8 System.out.println(~4); 9 } 10 }
2.2 位移运算符
运算符 | 含义 |
<< | 将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充 |
>> | 将操作数的二进制码整体右移指定位数,右移后右边空出来的位以符号位填充。即如果第一个操作数是正数,则左边补0;如果第一个操作数为负数,则左边补1 |
>>> | 无符号右移,他把第一个操作数二进制码右移指定位数,左边空出来的位总是以0补充 |
左移运算符
1 System.out.println(-8<<2);//输出为-32
-8的原码:1000_0000_0000_0000_0000_0000_0000_1000
-8的反码:1111_1111_1111_1111_1111_1111_1111_0111
-8的补码:1111_1111_1111_1111_1111_1111_1111_1000
左移两位:1111_1111_1111_1111_1111_1111_1110_0000
左移两位的反码:1111_1111_1111_1111_1111_1111_1101_1111
左移两位的原码:1000_0000_0000_0000_0000_0000_0010_0000 结果为-32
无符号右移运算符和有符号右移运算符
1 jshell> -5>>2 2 $1 ==> -2 3 4 jshell> -5>>>2 5 $2 ==> 1073741822 6 7 jshell>
-5的原码:1000_0000_0000_0000_0000_0000_0000_0101
-5的反码:1111_1111_1111_1111_1111_1111_1111_1010
-5的补码:1111_1111_1111_1111_1111_1111_1111_1011
-5>>2过程:
-5>>2: 1111_1111_1111_1111_1111_1111_1111_1110
-5>>2的反码:1111_1111_1111_1111_1111_1111_1111_1101
-5>>2的原码:1000_0000_0000_0000_0000_0000_0000_0010 结果位-2
-5>>>2过程:
-5>>>2:0011_1111_1111_1111_1111_1111_1111_1110
1 jshell> int a=0b0011_1111_1111_1111_1111_1111_1111_1110 2 a ==> 1073741822
三、赋值运算符和复合后的赋值运算符
赋值运算符为变量指定变量的值,通常用赋值运算符将一个直接量赋值给变量。与python、C语言相通,这里不多做解释。
所有的二进制位运算符都有一种将赋值与位运算组合在一起的简写形式。复合位赋值运算符由赋值运算符与位逻辑运算符和位移运算符组合而成。
复合赋值运算符 | 含义 | 复合赋值运算符 | 含义 |
+= | 对于x+=y,即对应与x=x+y | &= | 对于x&=y,即对应与x=x&y |
-= | 对于x-=y,即对应与x=x-y | |= | 对于x|=y,即对应与x=x|y |
*= | 对于x*=y,即对应与x=x*y | ^= | 对于x^=y,即对应与x=x^y |
/= | 对于x/=y,即对应与x=x/y | <<= | 对于x<<=y,即对应与x=x< |
%= | 对于x%=y,即对应与x=x%y | >>= | 对于x>>=y,即对应与x=x>>y |
>>>= | 对于x>>>=y,即对应与x=x>>>y |
只要能够使用复合运算符,通常推荐使用它们:
class 复合运算符 { public static void main(String[] args) { byte a=2; /* *下面的语句将出错————不兼容的类型: 从int转换到byte可能会有损失 *因为5是int类型,a+5将进行自动类型转换 *把一个int型变量赋值给byte类型的变量,将出错 */ //a=a+5; //下面的用法不会报错 byte b=a; b+=5; System.out.println(b); } }
虽然a=a+5与b+=5虽然运行结果相同,但是底层运行机制还是存在一定的差异。所以可以使用这种复合运算符,则推荐使用它们。
四、比较运算符
比较运算符 | 含义 |
> | 大于,只支持左右两边的操作数是数值类型。如果第一个操作数大于第二个操作数,则返回true |
>= | 大于等于,只支持左右两边的操作数是数值类型。如果第一个操作数大于等于第二个操作数,则返回true |
< | 大于,只支持左右两边的操作数是数值类型。如果第一个操作数小于第二个操作数,则返回true |
<= | 小于等于,只支持左右两边的操作数是数值类型。如果第一个操作数小于等于第二个操作数,则返回true |
== | 等于,(1)对于两个操作数都是数值类型,如果它们的值相等,则返回true (2)对于两个操作数都是引用类型,那么只有两个引用变量具有父子关系,且两个引用必须指向同一个对象才会返回true (3)也支持两个boolean类型的值进行比较,例如:false==true将返回false |
!= | 不等于,(1)对于两个操作数都是数值类型,如果它们的值不相等,则返回true (2)对于两个操作数都是引用类型,那么只有两个引用变量具有父子关系,且两个引用不指向同一个对象才会返回true (3)也支持两个boolean类型的值进行比较,例如:false==true将返回true |
实例:
1 class 比较运算符 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("5大于4:"+(5>4)); 6 System.out.println("97等于a:"+(97=='a')); 7 System.out.println("ture不等与false:"+(true!=false)); 8 9 //创建2个比较运算符对象 10 var t1=new 比较运算符 (); 11 var t2=new 比较运算符 (); 12 //t1,t2是同一个类的两个实例引用,所以可以比较 13 //但t1和t2引用不同的对象,所以返回false 14 System.out.println("t1等于t2:"+(t1==t2)); 15 16 //定义t3=t1,即t1,t2来自同一类的两个实例且指向同一对象 17 var t3=t1; 18 System.out.println("t3等于t1:"+(t1==t3)); 19 } 20 }
执行结果:
五、逻辑运算符
逻辑运算符 | 含义 |
&& | 与 ;&& 与 前后两个操作数必须都是true才返回true,否则返回false |
& | 不短路与 ; & 不短路与 表达式都会执行到 |
|| | 或; || 或 只要两个操作数中有一个是true,就返回true,否则返回false |
| | 不短路或 ;| 不短路 或 表达式都会执行到 |
! | 非;! 非 ,如果操作数为true,返回false,否则,返回true |
^ | 异或;^ 异或 ,当两个操作数不相同时返回true,返回false |
实例:
1 class 逻辑运算符 2 { 3 public static void main(String[] args) 4 { 5 var a=10; 6 var b=5; 7 8 //短路与&& 当第一个条件不满足时,不会判断第二个条件 9 if(a>15&&a++>2) 10 { 11 } 12 System.out.println("a的值为:"+a); 13 14 //不短路与& 当第一个条件不满足时,人然会判断第二个条件 15 if(b>6&b++>2) 16 { 17 } 18 System.out.println("b的值为:"+b); 19 }
---------- 运行Java ---------- a的值为:10 b的值为:6 输出完成 (耗时 0 秒) - 正常终止
六、三目运算符
三目运算符只有一个:?:,三目运算符的语法格式如下:
1 (expression)? if-true-statement:if-false-statement;
class 三目运算符 { public static void main(String[] args) { String str=5>3?"5大于3":"5小于3"; System.out.println(str); //三目运算符和if else功能相当 String str1=null; if(5>3) { str1="5大于3"; } else { str1="5小于或等于3"; } System.out.println(str1); } } ---------- 运行Java ---------- 5大于3 5大于3 输出完成 (耗时 0 秒) - 正常终止