JavaEE - 运算符

一、运算符

1. 算数运算符

算数运算符:+-*/%++--

知识点1:基本使用
int num1 = 100;
int num2 = 20;
int result = num1 + num2;
System.out.println(result);//120
System.out.println(num1 - num2);//80
System.out.println(100 * 20);//2000
System.out.println(100 / 20);//5
System.out.println(100 % 20);//0

//++:自增1
//++a:先自增1,再使用
int a = 10;
System.out.println(++a);//11
System.out.println(a);//11

//b++:先使用,再自增1
int b = 10;
System.out.println(b++);//10
System.out.println(b);//11

//--:自减1
//--c:先自减1,再使用
int c = 10;
System.out.println(--c);//9
System.out.println(c);//9

//d--:先使用,再自减1
int d = 10;
System.out.println(d--);//10
System.out.println(d);//9
*/
知识点2:深入算数运算符

案例1:byte、short做运算,会自动向上转型成int类型再做运算

byte b1 = 10;
byte b2 = 20;
//b1 - byte:0000,1010
//	 - int :0000,0000,0000,0000,0000,0000,0000,1010
//b2 - byte:0001,0100
//	 - int :0000,0000,0000,0000,0000,0000,0001,0100
//30 - int :0000,0000,0000,0000,0000,0000,0001,1110
//30 - byte:0001,1110
byte result = (byte)(b1 + b2);
System.out.println(result);

案例2:除了byte和short类型,其余的数值型做运算会向上转型成取值范围大的类型再做运算

int i = 20;
long l = 30;
long result = i+l;
System.out.println(result);

案例3:浮点型做运算有可能会失去精度,在工作用浮点数做运算都用BigDecimal去操作

double d1 = 0.5;
double d2 = 0.4;
double result = d1-d2;
System.out.println(result);//0.09999999999999998

案例5:char类型做运算,会获取字符的ASCII码

char c = 'a';//ASCII - 97
int i = c+1;
System.out.println(i);//98

案例6:分号代表一条执行语句的结束,不管先加还是后加都得加,所有i++;和++i;是没有区别的

int i = 10;
//i++;
++i;
System.out.println(i);//11

经典面试题一:输出结果为?

int a = 8;
int b = (a++)+(++a)+(a*10);
System.out.println(b);//118

经典面试题二:输出结果为?

int i = 0;   
i = ++i; 
System.out.println(i);//1
//底层实现:
//i = (int)(i+1);
//i = i

经典面试题三:输出结果为?

int i = 0;   
i = i++;  
System.out.println(i);//0
//底层实现:
//int temp = i;底层会有一个变量记录i最初的值
//i = (int)(i+1);
//i = temp
扩展

++i的底层实现
++i公式:i = (T)(i+1);
T是i的数据类型

int i = 10;
++i;//底层实现:i = (int)(i+1);
System.out.println(i);//11

byte b = 10;
++b;//底层实现:b = (byte)(b+1);

short s = 10;
++s;//底层实现:s = (short)(s+1);

double d = 12.1;
++d;//底层实现:d  = (double)(d+1);


2. 赋值运算符

赋值运算符:=+=-=*=/=%=

知识点1:基本使用
int num = 10;
num += 20;//num = (int)(num+20);
num -= 20;//num = (int)(num-20);
num *= 5; //num = (int)(num*5);
num /= 5; //num = (int)(num/5);
num %= 3; //num = (int)(num%3);
System.out.println(num);
知识点2:深入赋值运算符

经典面试题一:输出结果为?

int a,b; //一次性声明多个变量
a = b = 100;
System.out.println(a); //100
System.out.println(b); //100

经典面试题二:下面的两种写法结果分别是?

short s = 1; 
//报错原因:short类型的变量s与int类型的数字字面量1做运算的结果为int类型的数据,
//int类型的数据赋值给short类型的变量s会报错
s = s+1; 
short s=1; 
s += 1;//底层实现:s = (short)(s+1);

赋值规则:
      s += 1         s = (T)( (s) + (1) )
复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2))
其中T是E1的数据类型。


3. 关系运算符

关系运算符:==!=><>=<=

知识点1:基本使用
int num1 = 10;
int num2 = 20;

boolean bool = num1 == num2;
System.out.println(bool);//false

System.out.println(num1 != num2);//true
System.out.println(num1 > num2);//false
System.out.println(num1 >= num2);//false
System.out.println(num1 < num2);//true
System.out.println(num1 <= num2);//true

总结:

  1. 关系运算符的结果都是boolean类型,true或者 false
  2. 不要将==用成=
知识点2:深入关系运算符

经典面试题一:输出结果为?

int x = 10;
int y = 10;
boolean flag = (x == y);
System.out.println(flag);//true
flag = (x = y);//此行报错,报错原因:boolean不能与其他类型兼容
System.out.println(flag);

经典面试题二:输出结果为?

boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);
System.out.println(b3);//false
boolean b4 = (b1 = b2);
System.out.println(b4);//false

4. 逻辑运算符

逻辑运算符:&(与)、&&(短路与)、|(或) 、||(短路或)、^(异或)、!(非)

知识点1:基本使用

&与:前后两者都接boolean值
两个条件都成立(true),结果才为true

System.out.println(true & true);//true
System.out.println(false & true);//false
System.out.println(true & false);//false
System.out.println(false & false);//false

&&短路与:前后两者都接boolean值
两个条件都成立(true),结果才为true

System.out.println(true && true);//true
System.out.println(false && true);//false
System.out.println(true && false);//false
System.out.println(false && false);//false

注意:

  • & :判断前者为false后,还会判断后者
  • &&:判断前者为false后,不会判断后者,所以效率更高
System.out.println(false && 10/0>0);//false
System.out.println(10/0>0 && false);//报错ArithmeticException - 算数异常

|或:前后两者都接boolean值
两个条件有一个成立(true),结果就为true

System.out.println(true | true);//true
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false

||短路或:前后两者都接boolean值
两个条件有一个成立(true),结果就为true

System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(true || false);//true
System.out.println(false || false);//false

注意:

  • |:判断前者为true后,还会判断后者
  • ||:判断前者为true后,不会判断后者,所以效率更高
System.out.println(true || 10/0>0);//true
System.out.println(10/0>0 || true);//报错ArithmeticException - 算数异常

^异或:前后两者都接boolean值
两个条件相同为false,不同为true

System.out.println(true ^ true);//false
System.out.println(false ^ true);//true
System.out.println(true ^ false);//true
System.out.println(false ^ false);//false

!非:置反,true变成false,false变成true

boolean bool1 = true;
System.out.println(!bool1);//false
boolean bool2 = false;
System.out.println(!bool2);//true

案例:在dos窗口输入一个数字,判断是否在50~100的区间内

//1.在dos窗口输入一个数字
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个数字:");
int num = scan.nextInt();
//2.判断是否在50~100的区间内
boolean bool = num>=50 && num<=100;//num>=50 并且 num<=100
System.out.println(bool);

扩展:Scanner类

总结
  1. 逻辑运算符运行结果都是boolean类型
  2. &&&|||^两侧都是boolean类型数据

5. 位运算符

位运算符: &|^<<>>>>>

知识点1:基本使用

概念:将十进制的数据转换为二进制再做运算

byte b1 = 21; // 0001,0101
byte b2 = 30; // 0001,1110

&与:同位比较,两者都为1,结果才为1

//byte - 21 :0001,0101
//int  - 21 :0000,0000,0000,0000,0000,0000,0001,0101   自动向上转型成int类型再做运算
//byte - 30 :0001,1110
//int  - 30 :0000,0000,0000,0000,0000,0000,0001,1110
//int  - 20 :0000,0000,0000,0000,0000,0000,0001,0100
//byte - 20 :0001,0100
byte result = (byte)(b1 & b2);
System.out.println(result);//20 - 0001,0100

|或:同位比较,两者中1,结果就为1

System.out.println(b1 | b2);//31 - 0001,1111

^异或:同位比较,两者相同为0,不同为1

System.out.println(b1 ^ b2);//11 - 0000,1011

& | ^ 细节:

  • 前后两者都是boolean值,该符号为逻辑运算符
  • 前后两者都是数值,该符号为位运算符

<<左移:整体向左移动n位,用n个符号位补位

byte b1 = 8;//0000,1000
//byte 8 :0000,1000
//int  8 :0000,0000,0000,0000,0000,0000,0000,1000
//<<   2 :0000,0000,0000,0000,0000,0000,0010,0000
System.out.println(b1 << 2);//32

>>右移:整体向右移动n位,用n个符号位补位

byte b2 = 8;
//byte 8 :0000,1000
//int  8 :0000,0000,0000,0000,0000,0000,0000,1000
//>>   2 :0000,0000,0000,0000,0000,0000,0000,0010
System.out.println(b1 >> 2);//2

byte b3 = -8;
//byte -8 :1111,1000
//int  -8 :1111,1111,1111,1111,1111,1111,1111,1000
//>>   2  :1111,1111,1111,1111,1111,1111,1111,1110
System.out.println(b3 >> 2);//-2

>>>无符号位右移:整体向右移动n位,用n个0补位
注意:无符号位右移操作正数时,跟>>右移没有区别

byte b4 = 8;
//byte 8 :0000,1000
//int  8 :0000,0000,0000,0000,0000,0000,0000,1000
//>>>  2 :0000,0000,0000,0000,0000,0000,0000,0010
System.out.println(b4>>>2);//2

byte b5 = -8;
//byte -8 :1111,1000
//int  -8 :1111,1111,1111,1111,1111,1111,1111,1000
//>>>  2  :0011,1111,1111,1111,1111,1111,1111,1110
System.out.println(b5 >>> 2);//1073741822
知识点2:深入位运算符

经典面试题1:用最有效率的方式计算4*8

System.out.println(4<<3);

经典面试题2:描述下列代码输出结果

//-1 int:1111,1111,1111,1111,1111,1111,1111,1111
//(byte):1111,1111
//(char):1111,1111,1111,1111(考点:char类型的取值范围没有负数,所以向上补位用0)
//(int) :0000,0000,0000,0000,1111,1111,1111,1111
System.out.println((int)(char)(byte)-1);//65535

6. 三目运算符/三元运算符

知识点1:基本使用

语法结构:
数据类型 变量 = (表达式)?值1:值2;

表达式结果必须是boolean类型
表达式结果为true - 将值1赋值给变量
表达式结果为false- 将值2赋值给变量

int num = (false)?10:20;
System.out.println(num);//20
知识点2:深入三目运算符

案例1:在控制台输入两个int类型的数字,输出最大值

Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();

int max = (a>b)?a:b;

System.out.println("最大值为:" + max);

案例2:在控制台输入三个int类型的数字,输出最大值

Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();

int max = (a>b)?a:b;
max = (max>c)?max:c;

System.out.println("最大值为:" + max);

案例3:在控制台输入三个int类型的数字,由小到大输出

Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();

//最大值
int max = (a>b)?a:b;
max = (max>c)?max:c;

//最小值
int min = (a<b)?a:b;
min = (min<c)?min:c;

//中间值
int mid = a+b+c-max-min;

System.out.println(min + "<" + mid + "<" + max);

返回值规则:

  1. 值1和值2都是常量1返回值的类型为取值范围大的数据类型

  2. 值1和值2都是变量的情况,返回值的类型为取值范围大的数据类型

  3. 值1和值2有一个是常量有一个是变量的情况:

    常量是否在变量所属类型的取值范围里

    • 在 - 就按照变量所属类型返回数据
    • 不在- 就按照常量所属类型返回数据

扩展面试题1

int a = 5;
System.out.println((a<5)?10.9:9);//9.0

扩展面试题2

char x='x'; // 'x'的ASCII为120
int i=10;
System.out.println((false)?i:x);//120

扩展面试题3

char x='x';//'x'的ASCII为120
System.out.println((false)?100:x);//x
System.out.println((false)?65536:x);//120

7. 字符串拼接符

+两侧都是数值:此符号为算数运算符
+有一侧是字符串或者两侧都是字符串:此符号为字符串拼接符

System.out.println(1+2+"abc"+1+2);
//				    3 +"abc"+1+2
//					"3abc"  +1+2
//					"3abc1"   +2
//					"3abc12"

8. 表达式

算数表达式:5+6
关系表达式:5>6
逻辑表达式:true&&true


9. 运算符的优先级别

优先级运算符结合性
1() [] .从左到右
2! +(正) -(负) ~ ++ –从右向左
3* / %从左向右
4+(加) -(减)从左向右
5<< >> >>>从左向右
6< <= > >= instanceof从左向右
7== !=从左向右
8&(按位与)从左向右
9^从左向右
10|从左向右
11&&从左向右
12||从左向右
13?:从右向左
14= += -= *= /= %= &= |= ^= ~= <<= >>= >>>=从右向左

二、扩展

Scanner类

简介:Java提供的类,主要用于在dos窗口输入数据

使用步骤:

  1. 导包:import java.util.Scanner;
  2. 创建对象:Scanner scan = new Scanner(System.in);
  3. 调用方法(功能):int num = scan.nextInt();

细节:

  1. 使用Java提供的类需要在Java文件中的第一行导入包

  2. 使用功能必须要先创建对象

  3. 创建对象 :
    ​   类型  引用名 = 新建 的 对象
    Scanner scan = new Scanner(System.in);

  4. 方法介绍:调用方法必须使用对象所对应的引用名进行调用

//在窗口输入一个整数类型数字并赋值给程序中的num变量
int num = scan.nextInt(); 
//在窗口输入一个浮点类型数字并赋值给程序中的num变量
double num = scan.nextDouble();
//在窗口输入一个字符串并赋值给程序中的str变量
String str = scan.next();

5.方法调用几次,就可以在窗口输入几次


  1. 常量的含义:在程序执行过程中,该量不会发生改变 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值