一、运算符
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
总结:
- 关系运算符的结果都是boolean类型,true或者 false
- 不要将==用成=
知识点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);
总结
- 逻辑运算符运行结果都是boolean类型
&
、&&
、|
、||
、^
两侧都是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和值2都是常量1返回值的类型为取值范围大的数据类型
值1和值2都是变量的情况,返回值的类型为取值范围大的数据类型
值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窗口输入数据
使用步骤:
- 导包:import java.util.Scanner;
- 创建对象:Scanner scan = new Scanner(System.in);
- 调用方法(功能):int num = scan.nextInt();
细节:
使用Java提供的类需要在Java文件中的第一行导入包
使用功能必须要先创建对象
创建对象 :
类型 引用名 = 新建 的 对象
Scanner scan = new Scanner(System.in);
方法介绍:调用方法必须使用对象所对应的引用名进行调用
//在窗口输入一个整数类型数字并赋值给程序中的num变量
int num = scan.nextInt();
//在窗口输入一个浮点类型数字并赋值给程序中的num变量
double num = scan.nextDouble();
//在窗口输入一个字符串并赋值给程序中的str变量
String str = scan.next();
5.方法调用几次,就可以在窗口输入几次
常量的含义:在程序执行过程中,该量不会发生改变 ↩︎