1.算数运算符
正 +
负 -
加 +
减 -
乘 *
除 /
取余 %:结果正负与被取余的符号相同,例如6 % -5 = 1
自增 ++:
前++:先自增1,再运算
后++:先运算,再自增1
自增1不会改变变量本身的数据类型。使用num + 1的方式则会改变:例如short类型 + 1 会自动转换成int。
自减 --:
前–:先自减1,再运算
后–:先运算,再自减1
2.赋值运算符
=:两测数据类型不同时,可以使用自动类型转换或强制类型转换。支持连续赋值。
int i1 = i2 = 10;
int i3 = 10,i4 = 20;
不会改变变量本身的数据类型:
+=
-=
*=
/=
%=
3.比较运算符
比较运算符的结果都是布尔型:true、false
==
!=
<
>
<=
>=
instanceof 检查是否是类的对象
4.逻辑运算符
&:逻辑与
&&:短路与,结果与&相同,不同在于,当符号左边是false,右边不会执行。推荐使用
|:逻辑或
||:短路或,结果与|相同,不同在于,当符号左边是true,右边不会执行。推荐使用
!:逻辑非
^:逻辑异或:相同为false,不同为true
5.位运算符
位运算符操作的都是整型数据
<<:左移,例如左移3位i << 3
,相当于i乘2的3次幂
>>:右移,右移一位相当于 / 2
>>>:无符号右移,无论最高位是0还是1,都补0
&:与
|:或
^:异或
~:取反
位运算符练习:交换两个变量的值。
int num1 = 10;
int num2 = 20;
方式一:临时变量
int temp = num1;
num1 = num2;
num2 = temp;
方式二:
弊端:①相加操作可能超过存储范围。②只适用于数值类型。
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
方式三:位运算符
好处:方式二相比不用担心超过存储范围。
仍然只适用于数值类型。
num1 = num1 ^ num2;
num2 = num1 ^ num2;//原num1的值赋给num2
num1 = num1 ^ num2;
面试题:最高效的2*8的实现方式?
2 << 3;
8 << 1;
6.三元运算符
(条件表达式)?表达式1:表达式2
条件表达式的结果是boolean类型,为true则执行表达式1,为false则执行表达式2.
练习:获得两个整数的较大值。
int num1 = 10;
int num2 = 20;
int result = (num1>num2)?num1:num2;
三元运算符可以嵌套:
int num1 = 10;
int num2 = 10;
String s = (num1>num2) ? "num1大" : ((num1 == num2) ? "一样大":"num2大");
System.out.println(s);
练习:获得三个整数的最大值。
int num1 = 12;
int num2 = 30;
int num3 = -43;
int bigger = (num1>num2)?num1:num2;
int max = (bigger>num3)?bigger:num3;
System.out.println(max);
凡是三元运算符都可以改写成 if - else,反之不成立。
三元运算符的效率比 if - else 效率高:优先选择三元运算符。