运算符
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
1、算术运算符
基本算术运算符:
+,-,*,/,%
扩展的算术运算符:
++,--
/:两个数相除,默认取整
%:两个数进行取模,求余数!
Demo:
class OperatorDemo{
public static void main(String[] args){
//定义两个变量
int a = 3 ;
int b = 4 ;
//分别输出
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
//System.out.println(a/b);
System.out.println(a*1.0/b);
System.out.println("---------------");
System.out.println(a%b);
}
}
结果
扩展的算术运算符:
++,–
1、单独使用:
无论是++,–在数据前还是后,都是对当前数据本身进行自增1或者自减1!
2、参与运算使用:
++,–在数据之后,先进行运算,在进行自增1或者自减1
++,–在数据的前面,先进行自增1或者自减1,在参与运算
int m = 3 ;
int n = 4 ;
//++和--参与运算在数据之后
//int x = m++ ; //x=3 //m=3 --->m+1=4
//int y = n-- ; //y=4 n =4 --->n-1=3
//++和--参与运算在数据的前面
int x = ++ m; // m=3---->m+1=4---->赋值给x
int y = -- n;//同理
//分别输出
System.out.println("m:"+m);//4
System.out.println("n:"+n);//3
System.out.println("x:"+x);//3
System.out.println("y:"+y);//4
扩展题目
需求1:
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c–;
请分别计算出a,b,c的值
int a = 10;
int b = 10;
int c = 10;
a = b++;// a=10,b=11 ,c=10
c = --a;// a=9 , b=11, c=9
b = ++a;//a=10,b=10, c=9
a = c--;//a=9, b=10,c=8
System.out.println("a:"+a);//9
System.out.println("b:"+b);//10
System.out.println("c:"+c);//8
需求2:
int x = 4;
int y = (x++)+(++x)+(x*10);
计算出x,y的值
class OperatorTest{
public static void main(String[] args){
//定义x变量
int x = 4;
int y = (x++)+(++x)+(x*10);
//x = 4--->5
//y = 4 + 6 + 60
System.out.println("x:"+x);//6
System.out.println("y:"+y);//70
}
}
2、赋值运算符
基本的赋值运算符:
= 将=号右边的数据赋值给左边的某个类型的变量
注意事项:千万不能讲"=",写成"=="
扩展的赋值运算符:
+=,-=,*=,/=,%=
+=: 将=号右边的值和左边的变量值相加,然后在将结果赋值给左边的变量a
举例: int a = 10 ;
a += 20 ;
class OperatorDemo{
public static void main(String[] args){
//定义一个变量
int a = 10 ;//把10赋值给int类型的变量a
//定义两个x,y变量
int x , y ;
x = y = 20 ;
System.out.println("x:"+x+",y:"+y) ;
System.out.println("------------") ;
//int c == a ;
boolean flag = (a ==y) ;
System.out.println(flag);
System.out.println("------------") ;
int m = 20 ;
m += a ;//好像是m=m+a
System.out.println("m:"+m);
}
}
思考题:
A)short s=1; s = s+1;
B)short s=1;s+=1;
上面两个代码有没有问题,如果有,哪里有问题?
A)有问题,不兼容的类型,损失精度
存在默认类型提升—>byte,short,char,在参与运算的时候默认提升—int类型
s+1的结果是int类型,使用short类型的变量接收int的值不可以的!
如何解决?只能强制类型转换 s = (short)(s+1) ;
B)没有问题,对于扩展赋值运算符+=… 隐藏了强制类型转换
class OperatorDemo2{
public static void main(String[] args){
//定义short变量
//short s = 1 ;
//报错:不兼容的类型: 从int转换到short可能会有损失精度
//s = s +1 ;
//输出变量s
//System.out.println("s:"+s);
//变量s
short s = 1;
s += 1;// 等价于 s = (short)(s+1) ;
System.out.println("s:"+s);
}
}
3、比较运算符
比较(关系)运算符
>,>=,<=,<,!=,==
注意事项:
无论当前比较运算符连接的是简单的数据还是复杂的表达式,最终结果都是boolean类型
class OperatorDemo{
public static void main(String[] args){
//定义两个变量
int x = 10 ;
int y = 20 ;
int z = 30 ;
System.out.println(x > y) ;
System.out.println((x+y) >= (x+z)) ;
System.out.println("-------------------");
System.out.println(x >= y) ;
System.out.println(x < y) ;
System.out.println(x <= z) ;
System.out.println(x != y) ;
System.out.println(x == y) ;
System.out.println("-------------------");
int a = 3 ;
int b = 4 ;
boolean flag = (a==b) ; //flag接收的布尔值
//boolean flag =(a=b) ; //将b的值赋值给a,a的值留下来进行赋值 ,报错:不兼容的类型: int无法转换为boolean
}
}
输出结果:
false
false
false
true
true
true
false
4、逻辑运算符
基本的逻辑运算符:
1、 逻辑与&
结论:有false,则false
2、逻辑或|
结论:有true,则true
3、逻辑异或^
结论:相同则为false,不同则为true
简单记忆:男女关系
男男 男女 女男 女女
4、逻辑非!
结论:非false,则true;非true则false
偶数个非是他本身!
class OperatorDemo{
public static void main(String[] args){
//定义三个变量
int a = 3;
int b = 4 ;
int c = 5 ;
//逻辑与&
System.out.println((a>b) & (a>c));//false & false = false
System.out.println((a>b) & (a<c));//false & true = false
System.out.println((a<b) & (a>c));//true & false = false
System.out.println((a<b) & (a<c));//true & true = true
System.out.println("-------------------");
//逻辑或|
System.out.println((a>b) | (a>c)); //false | false = false
System.out.println((a>b) | (a<c)); //false | true = true
System.out.println((a<b) | (a>c));//true | false = true
System.out.println((a<b) | (a<c));//true | true = true
System.out.println("-------------------");
//逻辑异或^
System.out.println((a>b) ^ (a>c)); //false ^ false = false
System.out.println((a>b) ^ (a<c)); //false ^ true = true
System.out.println((a<b) ^ (a>c)); //true ^ false = true
System.out.println((a<b) ^ (a<c)) ;//true ^ true = false
System.out.println("-------------------");
//逻辑非
System.out.println(!(a>b)) ;//!false = true
System.out.println(!!(a>b)) ;//!!false = false
System.out.println(!!!!(a>b));//false
}
}
扩展的逻辑运算符:
1、逻辑双与&&
2、逻辑双或||
面试题:
逻辑双与&& 和逻辑单与&的区别?
a)&&和&都符合,有false,则false
b)逻辑双与&&
如果&&符号的左边表达式位false,右边就不执行了, (短路效果)
逻辑||同理,左边的表达式为true,右边不执行了!
class OperatorDemo2{
public static void main(String[] args){
//定义三个变量
int a = 3;
int b = 4 ;
int c = 5 ;
//逻辑双与&&
System.out.println((a>b) && (a>c));
System.out.println((a>b) && (a<c));
System.out.println((a<b) && (a>c));
System.out.println((a<b) && (a<c));
System.out.println("-------------------") ;
//定义两个变量
int x = 3 ;
int y = 4 ;
//boolean flag = ((x++)==3 & (y++)==4) ;
//boolean flag = ((x++)==3 && (y--)==4) ;
boolean flag = ((++x)==3 && (y--)==4) ;
System.out.println("x:"+x);//4 //4 //4
System.out.println("y:"+y);//5 //3 //4
System.out.println("flag:"+flag);//true //false
}
}
5、位运算符
位与&:
有0则0
位或|:
有1则1
位异或^:
相同则为0,不同则为1
~ 反码:逐位取反,然后还需要通过得到补码---->原码
<<:左移
>>:右移
>>>:无符号右移
class OperatorDemo{
public static void main(String[] args){
System.out.println(3 & 4);//0
System.out.println(3 | 4);//7
System.out.println(3 ^ 4);//7
System.out.println(~ 3);//-4
}
}
首先,计算出这些数据的对应的二进制数据,然后进行位运算
十进制3---->二进制:11
十进制4---->二进制:100
位异或的特点:
一个数据位异或另一个数据两次,其值是他本身!
应用场景:简单的数据加密
高级加密: md5
安全框架(Spring security)
<<:左移动,最高位丢弃掉,右边补0
>>:右移,最高位如果是1,左边补1,最高位是0,左边补0
>>>:无符号右移
最高位无论是1还是0,都补0
面试题:
有效的方式写出2乘以8的结果
答: 2 << 3
class OperatorDemo3{
public static void main(String[] args){
//<<
//结论:将当前<<符号的左边的数据乘以2的移动次幂
System.out.println(3 << 2);//3*2^2 = 12
//>>
//结论:将当前>>左边的数据除以2的移动次幂
System.out.println(24 >> 3);//24/2^3 = 3
System.out.println(24 >> 2) ;
System.out.println(-24 >> 2) ;//-6
//>>>
System.out.println(-24 >>> 2) ;//1073741818
}
}
-24>>>2
拓展:
面试题:
将两个数据的值进行互换。
面试官考查---->位运算符中位异或特点
class OperatorTest{
public static void main(String[] args){
//定义两个变量
int a = 10 ;
int b = 20 ;
//分别输出a,b
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("--------------") ;
//方式1:最常用的方式 :使用中间变量 (开发中常用)
//定义一个中间变量
int temp = a ;
a = b ;
b = temp ;
System.out.println("a:"+a);
System.out.println("b:"+b);
//方式2:位异或的特点 (面试过程中)
//左边:a,b,a
//右边:a ^ b
/*
a = a ^ b ;
b = a ^ b ;//b = a ^ b ^ b ; = a
a = a ^ b ;//a = a ^ b ^ a ; = b
System.out.println("a:"+a);
System.out.println("b:"+b);
*/
//方式3:变量相加/相减
/*
a = a + b ; //a = 3 0;
b = a - b ;//b = 30 - 20 ;
a = a - b ;//a = 30 -10 ;
System.out.println("a:"+a);
System.out.println("b:"+b);
*/
//方式4:一步走
/*
b = (a+b) - (a=b) ;
System.out.println("a:"+a);
System.out.println("b:"+b);
*/
}
}
6、三目运算符
单目 :a
二目:x + y
三元(三目)运算符(开发中经常用到)
格式:(表达式)? 执行true的结果:执行flase的结果;
三元运算符执行流程:
1)先判断表达式是否成立
2)如果成立,执行true的结果
3)不成立,执行false的结果
class OperatorDemo{
public static void main(String[] args){
//定义两个变量
int x = 100 ;
int y = 200 ;
//定义变量max
int c = (x<y)? x : y;
System.out.println("c:"+c);
System.out.println("-----------------") ;
int a = 3 ;
int b = 4 ;
//可以这样书写,但是"=="本身就是做比较,结果就是boolean类型
//**注意**:boolean flag = (a==b)?true:false;
boolean flag = a==b;
//输出
System.out.println(flag) ;
}
}
拓展题目:
没有说明数据类型,都默认使用int接收!
1、获取两个整数中的最大值
2、获取三个整数中的最大值
3、比较两个整数是否相同
class OperatorTest{
public static void main(String[] args){
//获取两个整数中的最大值
int a = 3 ;
int b = 4 ;
//三元运算符
int max = ((a>b)? a : b);
System.out.println("max:"+max);
//获取三个整数中的最大值
int x = 10 ;
int y = 30 ;
int z = 20 ;
//方式1:使用中间变量的方式(三元)
//定义变量temp
int temp = ((x > y)? x : y);
//使用temp和z进行比较
int max2 = (( temp > z) ? temp : z) ;
System.out.println("三个数据中的最大值是:"+max2);
//方式2:直接使用三元一步走
int max3 = (x > y)? ((x > z) ? x : z) :((y > z) ? y:z) ;
//不推荐:在使用三元运算符的时候,一定要注意括号的使用
//int max3 = x > y? x > z ? x : z :y > z ? y:z ;
System.out.println("max3的值是:"+max3) ;
System.out.println("--------------------");
//比较两个整数是否相同
int m = 100 ;
int n = 120 ;
//boolean flag = (m==n)? true :false ;
boolean flag = m==n;
System.out.println(flag) ;
}
}