运算符
算术运算符
1、+
(1)左、右都为数值型,则做加法运算
(2)左、右其中一方为字符串,则做拼接运算
(3)运算顺序从左至右
(4)char 类型在运算时,转换成对应码值
2、-
(1)负号
(2)减法运算
3、*
(1)乘法运算
4、/
(1)除法运算
System.out.println(10 / 4);//2
System.out.println(10.0 / 4);//2.5
double d1 = 10 / 4;//2.0
System.out.println(d1);
5、%
(1)取模 / 取余
(2)本质:a % b = a - a / b * b
System.out.println(10 % 3);//1
System.out.println(-10 % 3);//-1
System.out.println(10 % -3);//1
System.out.println(-10 % -3);//-1
6、++ / --
(1)自增 / 自减
(2)作为独立语句使用:i++ <=> ++i,i-- <=> --i
(3)作为表达式使用:i++:先执行后自增,++i:先自增后执行;i--:先执行后自减,--i:先自减后执行
(4)强制转换为表达式中最高类型:i++ <=> i = i + 1;i-- <=> i = i - 1
(5)强制转换为原类型:++i <=> i += 1 <=> i = (i.Type)(i + 1);--i <=> i -= 1 <=> i = (i.Type)(i - 1)
关系运算符
1、结果都为 boolean 类型
2、“==”是关系运算符,“=”是赋值
关系运算符 | 含义 | 例 | 结果 |
== | 相等于 | 1 == 2 | false |
!= | 不等于 | 1 != 2 | true |
< | 小于 | 1 < 2 | true |
> | 大于 | 1 > 2 | false |
<= | 小于等于 | 1 <= 2 | true |
>= | 大于等于 | 1 >= 2 | false |
instanceof | 检查是否为类的对象 | "abc" instanceof String | true |
逻辑运算符
1、&&(短路与):条件 1 && 条件 2,若条件 1 为 false,则不会判断条件 2 ,效率高
2、&(逻辑与):条件 1、条件 2 都会判断,效率低
3、||(短路或):条件 1 || 条件 2,若条件 1 为 true,则不会判断条件 2 ,效率高
4、|(逻辑或):条件 1、条件 2 都会判断,效率低
5、!(取反):!条件,条件为 true,取反后为 false;条件为 false,取反后为true
6、^(逻辑异或):条件 1 ^ 条件 2,条件 1、条件 2 相同时,结果为 false;条件 1、条件 2 不同时,结果为 true
条件 | 运算结果 | ||||||
a | b | a & b | a && b | a | b | a || b | !a | a ^ b |
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
赋值运算符
1、基本赋值运算符:=
2、复合赋值运算符:+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、|=
3、特点
(1)运算顺序从右往左
(2)赋值运算符左方只能为变量,右方可以是变量、表达式、常量值
(3)复合赋值运算符会强制转换类型
byte b1 = 3;
b1 += 3;//等价于 b = (byte)(b + 3)
byte b2 = 3;
b2 = b2 + 3;//错误,b为byte,3为int,(b + 3)自动转换为int,而int不能赋值给byte
三元运算符
1、基本语法:条件表达式 ? 表达式1 : 表达式2;
2、运算规则
(1)条件表达式为 true,返回表达式 1
(2)条件表达式为 false,返回表达式 2
3、事项
(1)若表达式 1、表达式 2 是可以赋给接收变量的类型,则表达式可以自动转换类型或强制转换类型
int a = 1;
int b = 2;
int c = a > b ? (int) 3.5 : (int) 4.5;//强制转换类型
double d = a > b ? a : b;//自动转换类型
(2)三元运算符可以转换为 if else 语句
(3)三元运算符是一个整体,相当于完整表达式,先自动转换类型到最高精度,再判断运算
(4)三元运算符可以嵌套三元运算符,运算顺序从左往右,结合顺序从右往左
4、转换规则
(1)若两个操作数不可转换,则不做转换,返回值为 Object 类型
(2)若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int 类型转换为 long 类型,long 类型转换为 float 类型等
(3)若两个操作数中有一个是数字 S,另外一个是表达式,且其类型标示为 T,那么,若数字 S 在 T 的范围内,则转换为 T 类型;若 S 超出了 T 类型的范围,则 T 转换为 S 类型
(4)若两个操作数都是直接量数字,则返回值类型为范围较大者
5、以下两种场景会触发类型对齐的拆箱操作
(1)表达式 1 或表达式 2 的值只有一个是原始类型
(2)表达式 1 或表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型
6、表达式 1 和 表达式 2 在类型对齐时,可能抛出因自动拆箱导致 NullPointerException
7、布尔条件表达式
(1)如果第二个和第三个操作数都是 Boolean,那么条件表达式就是 Boolean
(2)否则,条件表达式的类型为 boolean
8、数字条件表达式
(1)如果第二个和第三个操作数的类型相同,那么这就是条件表达式的类型
(2)如果第二个和第三个操作数中的一个是原始类型 T,而另一个操作数的类型是对 T 进行装箱转换的结果,那么条件表达式的类型就是 T
(3)如果操作数之一是 byte 或 Byte,而另一个操作数是 short 或 Short,那么条件表达式的类型就是 short
(4)如果操作数之一是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式,其值可以用 T 类型表示,那么条件表达式的类型是 T
(5)如果操作数之一是 T 类型,其中 T 是 Byte、Short 或 Character,而另一个操作数是 int 类型的常量表达式,其值可以用类型 U 来表示,而类型 U 是对 T 进行开箱转换的结果,那么条件表达式的类型是 U
(6)否则,将对操作数类型进行二进制数值提升(自动类型转换),条件表达式的类型就是第二和第三个操作数的提升类型
(7)注意,二进制数值提升(自动类型转换)执行值集转换(value set conversion),并可能执行拆箱转换
9、引用条件表达式(独立引用条件表达式)
(1)如果第二个和第三个操作数的类型相同(可能是 null),那么这就是条件表达式的类型
(2)如果第二操作数和第三操作数之一的类型是 null,而另一个操作数的类型是引用类型,那么条件表达式的类型就是该引用类型
(3)否则,第二和第三个操作数分别是 S1 和 S2 类型。假设 T1 是对 S1 进行装箱转换后的类型,T2 是对 S2 进行装箱转换后的类型。条件表达式的类型就是对 lub(T1, T2) 进行捕获转换后的结果(即返回最小相同父类)
位运算符
1、&(按位与):两位全为 1,运算结果为 1,否则为 0
2、|(按位或):两位其中为 1,运算结果为 1,否则为 0
3、^(按位异或):两位一个为 1,另一个为 0,运算结果为 1,否则为 0
4、~(按位取反):0 变 1,1 变 0
byte b1 = 2;
byte b2 = 3;
byte b3 = -2;
System.out.println(b1 & b2);
/*
2的原码、补码:00000010
3的原码、补码:00000011
按位与&运算后
运算结果的补码、原码:00000010
二进制原码转为十进制:2
*/
System.out.println(~b3);
/*
-2的原码:10000010
-2的反码:11111101
-2的补码:11111110
按位取反~运算后
结果的补码、原码:00000001
二进制原码转十进制:1
*/
5、>>(算术右移):低位溢出,符号位不变,符号位缺失的高位
(1)a >> b 本质:a / 2b
6、<<(算术左移):高位溢出,符号位不变,0 补缺失的低位
(1)a << b 本质:a * 2b
7、>>>(逻辑右移 / 无符号右移):低位溢出,0 补缺失的高位
(1)没有 <<< 符号
运算符优先级
从高到低,优先级减小 | . () {} ; , | ||
从右向左运算 | 单目运算符 | ++ -- ~ ! | |
从左到右运算 | 算术运算符 | * / % | |
+ - | |||
位移运算符 | << >> >>> | ||
比较运算符 | < > <= >= instanceof | ||
== != | |||
逻辑运算符 | & | ||
^ | |||
| | |||
&& | |||
|| | |||
三元运算符 | ? : | ||
从右到左运算 | 赋值运算符 | = *= /= %= | |
+= -= <<= >>= | |||
>>>= &= ^= |= |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战