运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
1、算术运算符
- 注意问题:
- %:取余运算,结果的符号与被模数的符号相同;
- /:除号,整数除和小数除是有区别的,整数之间做除法时,只
保留整数部分而舍弃小数部分; - +:除字符串相加功能外,还能把非字符串转换成字符串;
- ++、–:自增/自减,不会改变变量本身的数据类型;
public class Test {
public static void main(String[] args) {
//除号:/
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
System.out.println(result1);//2
double result2 = num1 / num2;
System.out.println(result2);//2.0
double result3 = (double)num1 / num2;
System.out.println(result3);//2.4
// %:取余运算,结果的符号与被模数的符号相同
int m1 = 12;
int n1 = 5;
System.out.println("m1 % n1 = " + m1 % n1);//2
int m2 = -12;
System.out.println("m2 % n1 = " + m2 % n1);//-2
//(前)++ :先自增1,后运算
//(后)++ :先运算,后自增1
int a1 = 10;
int b1 = a1++;
int b2 = ++a1;
System.out.println("a1 = " + a1 + ",b1 = " + b1 + ",b2 = " + b2);// a1 = 12,b1 = 10,b2 = 12
byte bb1 =127;
//bb1 = bb1+ 1;//编译失败
bb1++;//不会改变变量本身的数据类型
System.out.println("bb1 = " + bb1);// -128
}
}
2、赋值运算符
- 符号: =
- 当“=”两侧数据类型不一致时, 可以使用自动类型转换或使用强制类型转换原则进行处理。
- 支持连续赋值。
- 扩展赋值运算符: +=, -=, *=, /=, %=,不会改变变量本身的数据类型;
public class Test {
public static void main(String[] args) {
//赋值符号:=
int i1 = 10;
//连续赋值
int i2,j2;
i2 = j2 = 10;
int i3 = 10,j3 = 20;
//int i4 = j4 = 10;//编译失败
short s1 = 10;
//s1 = s1 + 2;//编译失败
s1 += 2;//不会改变变量本身的数据类型
System.out.println(s1);
}
}
3、比较运算符(关系运算符)
- 比较运算符的结果都是boolean型,也就是要么是true,要么是false。
- 比较运算符“==”不能误写成“=” 。
- > < >= <= :只能使用在数值类型的数据之间。
- == 和 !=: 不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间。
public class Test {
public static void main(String[] args) {
int i = 10;
int j = 20;
System.out.println(i == j);//false
System.out.println(i = j);//20
boolean b1 = true;
boolean b2 = false;
System.out.println(b2 == b1);//false
System.out.println(b2 = b1);//true
//比较两个Account是否是同一个账户。
Account acct1 = new Account(1000);
Account acct2 = new Account(1000);
boolean b3 = (acct1 == acct2);
}
}
4、逻辑运算符
&—逻辑与 | —逻辑或 ! —逻辑非 && —短路与 || —短路或 ^ —逻辑异或
- 逻辑运算符用于连接布尔型表达式,而且结果也是boolean类型;在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
- “&”和“&&”:
- &,左边无论真假,右边都进行运算;
- &&,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
- & 与 && 的运算结果相同;
- “|”和“||”的区别同理, ||表示:当左边为真,右边不参与运算。
- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
- 理解:异或,追求的是“异” !
public class Test {
public static void main(String[] args) {
boolean b1 = false;
int num1 = 10;
if(b1 && (num1++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num1 = " + num1); // 10
if(b1 & (num1++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num1 = " + num1); // 11
}
}
5、位运算符
运算符 | 运算 | 范例 | 细节 |
---|---|---|---|
<< | 左移 | 3 << 2 = 12 --> 3 * 2 * 2=12 | 空位补0,被移除的高位丢弃,空缺位补0。 |
>> | 右移 | 3 >> 1 = 1 --> 3/2=1 | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 |
>>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 与运算 | 6 & 3 = 2 | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 或运算 | 6 | 3 = 7 | 二进制位进行 |
^ | 异或运算 | 6 ^ 3 = 5 | 相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0;不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1 |
~ | 取反运算 | ~6 = -7 | 正数取反,各二进制码按补码各位取反;负数取反,各二进制码按补码各位取反 |
- 位运算符操作的都是整型的数据;
- << :在一定范围内,每向左移1位,相当于 * 2;
>> :在一定范围内,每向右移1位,相当于 / 2; - 典型题目:
- 1.实现最高效的2 * 8。答案:2 << 3 或 8 << 1。
- 2.交换两个变量的值。
- 3.实现60的二进制到十六进制的转换。
public class Test {
public static void main(String[] args) {
int i = -21;
System.out.println("i << 2 :" + (i << 2));// -84
System.out.println("i << 27 :" + (i << 27));// 1476395008
int m = 12;
int n = 5;
System.out.println("m & n :" + (m & n));//4
System.out.println("m | n :" + (m | n));//13
System.out.println("m ^ n :" + (m ^ n));//9
//交换两个变量的值
int num1 = 10;
int num2 = 20;
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
System.out.println("num1 = " + num1 + ",num2 = " + num2);
}
}
6、三元运算符
- 格式:(条件表达式)?表达式1:表达式2;
- 条件表达式的结果为boolean类型;
- 如果表达式为true,则执行表达式1。
- 如果表达式为false,则执行表达式2。
- 表达式1和表达式2为同种类型;
- 三元运算符可以嵌套使用;
- 三元运算符与if-else的联系与区别:
- 三元运算符可简化if-else语句;
- 三元运算符要求必须返回一个结果;
- if后的代码块可有多个语句;
- 凡是可以使用三元运算符的地方,都可以改写为if-else,反之,不成立;
- 既可以使用三元运算符又可以使用if-else结构时,优先选择三元运算符。原因:简洁、执行效率高。
public class Test {
public static void main(String[] args) {
//获取两个整数的较大值
int m = 12;
int n = 5;
int max = (m > n)? m : n;
System.out.println(max);
//改写成if-else:
if(m > n){
System.out.println(m);
}else{
System.out.println(n);
}
}
}
- 运算符的优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算
符总优先于下一行。 - 只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算
运算顺序 | 运算符 |
---|---|
. () {} ; , | |
R—>L | ++ – ~ !(data type) |
L—>R | * / % |
L—>R | + - |
L—>R | << >> >>> |
L—>R | < > <= >= instanceof |
L—>R | == != |
L—>R | & |
L—>R | ^ |
L—>R | | |
L—>R | && |
L—>R | || |
R—>L | ? : |
R—>L | = *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |= |