一.算术运算符
1.基本算术运算符:
+, -, *, /, %
2.扩展的算术运算符:
++或者--
情况1:单独使用:
++或者--在数据的前面
++或者--在数据的后面无论在数据的前面还是后面,都是对当前变量的值进行自增1或者自减1
情况2:参与运算使用:
++或者--在数据的前面:先进行自增1或者自减1,然后参与运算
++或者--在数据的后面:先进行运算,然后再自增1或者自减1
二.赋值运算符
1.基本赋值运算符:
=
2.扩展的赋值运算符:
+=, -=, *=, /=, %=
eg:
/*编译出错*/ class OperatorTest{ public static void main(String[] args){ short s = 1 ; s = s + 1 ;//从int转换到short可能会有损失 //Java默认类型提升(隐式类型转换)当byte,short,char三者不转换,一旦参与运算,优先提升int //= 右边是int类型的结果,=左边short接收,无法接收大类型必须强转类型转换 System.out.println("s:"+s) ; } }
/*编译正确*/ class OperatorTest{ public static void main(String[] args){ short s = 1 ; s += 1 ; //s是short类型,扩展的赋值运算符在这种场景下,隐藏了强制类型转换 //等价于 s = (short)(s+1); System.out.println("s:"+s) ; } }
三.关系运算符
关系运算符:<, >=, >, >=, ==, !=
这些符号连接的表达式无论简单的还是复杂的,最终的结果肯定boolean类型,要么true,要么false!
四.逻辑运算符
基本的逻辑运算符:
逻辑单与&
特点: 并列关系(交集),有false,则false
逻辑单或|:
特点: 或的关系(并集),有true,则true
逻辑异或^:
特点: 相同则为false,不同则为true
逻辑非!:
特点:非true,则false;非false,则true; 偶数个非是它本身扩展的逻辑运算符
逻辑双与-----&&
逻辑双或-----||
逻辑双与&&和逻辑单与&的区别?
共同点:都表示并列关系,有false,则false!(有一个条件不成立,则不成立)
不同点:
逻辑双与&&连接的表达式如果左边位false,则右边不执行了,它具有短路效果!
实际开发中,针对逻辑判断,并列条件都使用&&,效率要比单与&要高,左边为false,整个结果就是false!
逻辑单与&:执行效率低,左边位false,右边还要执行!
逻辑双或||: 连接的表达式如果左边为true,则右边不执行,具有短路效果,有true,则true!
class OperatorDemo2{ public static void main(String[] args){ int x=3; int y=4; System.out.println((++x)==3&&(--y)==3); System.out.println("x:"+x+"y:"+y); } }
五.位运算符
位运算符: 使用变量或者数据值本身进行计算的!
基本的符号:
位与&: 有0则0
位或|: 有1则1
位异或^: 相同则为0,不同则为1
反码~: 在数据的补码基础上,全部按位取反0变1,1变0class OperatorDemo{ public static void main(String[] args){ System.out.println(3 & 4) ;//3位与4 System.out.println(3 | 4) ;//3位或4 System.out.println(3 ^ 4) ;//3位异或4 System.out.println(~3) ;//反码3 } } /* 位与&:有0则0 将这个数据默认int 3和4的二进制数据---原码 ,反码,补码相同 00000000 00000000 00000000 00000011 位与& 00000000 00000000 00000000 00000100 ------------------------------------------- 00000000 00000000 00000000 00000000 结果:0 位或|: 有1则1 3和4的二进制数据---原码 ,反码,补码相同 00000000 00000000 00000000 00000011 位或| 00000000 00000000 00000000 00000100 ------------------------------------ 00000000 00000000 00000000 00000111 ---补码---反码---原码 结果:7 位异或:^ :相同则为0,不同则为1 3和4的二进制数据---原码 ,反码,补码相同 00000000 00000000 00000000 00000011 位异或^ 00000000 00000000 00000000 00000100 ------------------------------------ 00000000 00000000 00000000 00000111 结果:7 反码~: ~数据:不分最高符号位,所有的数据按位取反,0变1,1变0 00000000 00000000 00000000 00000011 ---原码---反码---补码 补码: 00000000 00000000 00000000 00000011 11111111 11111111 11111111 11111100 ----补码操作 有符号位的数据表示法 最高符号位 数值位 补码 1 1111111 11111111 11111111 11111100 - 1 ------------------------------------------------ 1 1111111 11111111 11111111 11111011 反码 ------------------------------------------------- 1 0000000 00000000 00000000 00000100 = - 4 */
位异或的最大特点:
一个数据被另一个数据位异或两次,其值是它本身!移位符号:
<<, >>, >>>
左移:<<
将<<符号左边的数据向左移动多少位,右边不够的补0,最高位丢弃掉
特点:
将<<符号左边的数据乘以2的移动次幂
eg: 3<<2 =3*2^2
右移:>>
将>>符号左边的数据向右移动多少位,最高位是0,右移后,空缺位补0;最高位是1,最高位补1
特点:
使用>>左边数据除以2的移动次幂
eg:
24>>3 =24/2^3
无符号右移:>>>
将>>>符号左边的数据进行向右移动,无论最高位是1还是0,都是补0
class OperatorDemo3{ public static void main(String[] args){ //<< System.out.println(3<<2) ;//3左移2位 //>> System.out.println(24>>2) ;//24右移动2位 //>> System.out.println(-24>>2) ; //>>>:无符号右移 System.out.println(-24>>>2) ; } } /* 3<<2:左移2位 将3-----原码,反码,补码相同 00000000 00000000 00000000 00000011 (00)000000 00000000 00000000 0000001100----> 补码 000000 00000000 00000000 0000001100 --反码---原码:相同00000000 00000000 00000000 00001100 =12 24>>2 24右移动2位 24的原码,反码,补码相同 00000000 00000000 00000000 00011000 0000000000 00000000 00000000 000110 (00) 00000000 00000000 00000000 00000110 补码----反码---原码 :相同 =6 -24>>2 :负的24右移2位 1 0000000 00000000 00000000 00011000 -24 原码 反码:最高符号位不变,数值位按位取反 1 1111111 11111111 11111111 11100111 -24 反码 + 1 ------------------------------------------------ 1 1111111 11111111 11111111 11101000 -24的补码 移动向右移动2位 111 1111111 11111111 11111111 111010(00) 11111111 11111111 11111111 11111010 补码 - 1 --------------------------------------- 11111111 11111111 11111111 11111001 反码 10000000 00000000 00000000 00000110 原码 - 6 -24>>>2 无符号右移 1 0000000 00000000 00000000 00011000 -24 原码 反码:最高符号位不变,数值位按位取反 1 1111111 11111111 11111111 11100111 -24 反码 + 1 ------------------------------------------------ 1 1111111 11111111 11111111 11101000 -24的补码 >>>2 001 1111111 11111111 11111111 111010(00) 001 1111111 11111111 11111111 111010 ---补码---反码---原码 1,073,741,818 */
六.三元运算符
格式:
(表达式)?执行TRUE的结果:执行FALSE的结果;
注意:
没有提示类型都是默认int