一、运算符
1.算数运算符
算数运算符的使用
符号:+ , - , * , / , % , ++ , –
加、减、乘、除、求余、自增、自减
++a与a++:++a:先自增1,再使用
a++:先使用,再自增1
自减同理
特殊点
特殊点1:byte做运算,会向上转型成int,再做运算
特殊点2:short做运算,会向上转型成int,再做运算
特殊点3:除了byte和short做运算会转型成int,其他数值类型做运算会按照取值范围大的类型转型后再做运算
特殊点4:浮点类型做运算可能会失去精度,失去精度问题可以使用BigInteger或BigDecimal去解决
特殊点5:++a; 和 a++; 没有区别,因为分号为执行语句的结束符,不管先加还是后加都给我自增1
特殊点6:++底层会强转
特殊点7:char类型可以做算数运算
特殊点8:boolean不能与其他类型兼容
转型原理:1.自动转型使用最高位补位
2.强制转型从最高位开始舍弃
//转型原理: 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 // int:0000,0000,0000,0000,0000,0000,0001,1110 //强转: (byte):0001,1110 byte result = (byte)(b1 + b2); System.out.println(result);
ArithmeticException - 算数异常
在做除法运算时当被除数为0时会报算数异常
2.赋值运算符
赋值运算符
符号:=、+=、-=、*=、/=、%=
注意:其中"="为赋值运算符,及将右边的值赋值给左边的变量
赋值举例:
int num = 10; num += 5;//num = (int)(num+5); num -= 5;//num = (int)(num-5); num *= 5;//num = (int)(num*5); num /= 5;//num = (int)(num/5); num %= 3;//num = (int)(num%3); System.out.println(num);
赋值规则:
s += 1 s = (short)((s) + (1))
复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2)),其中T是E1的类型。
3.关系运算符
符号:==、!=、>、>=、<、<=
注意:
==判断两个值是否相等
!=判断两个值是否不相等
关系运算符的结果必须是boolean
4.字符串拼接符
符号:+
注意:
+两侧都是数值,该符号为算数运算符
+两侧有一侧或两侧是字符串,该符号为字符串拼接符
5.逻辑运算符
符号:
&与 &&短路与
|或 ||短路或
^异或
!非
注意:
1.逻辑运算符运行结果都是boolean类型
2.&、&&、|、||、^ 两侧都是boolean类型数据,!后面跟boolean类型数据
&与:前后两侧都是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后,不会判断后者,直接返回false,所以效率更高
System.out.println(false & 10/0>3);//会报算数异常 System.out.println(false && 10/0>3);//输出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
||短路或:前后两侧都是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后,不会判断后者,直接返回true,所以效率更高
System.out.println(true | 10/0>3);//会报算数异常 System.out.println(true || 10/0>3);//输出false
^异或:前后两侧都是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
!非:置反
boolean bool1 = true; System.out.println(!bool1);//false boolean bool2 = false; System.out.println(!bool2);//true
6.三目运算符
语法规则:变量 = (表达式)?值1:值2;
表达式:如 5+6 算数表达式
5>6 关系表达式理解:三目运算的本质是对表达式进行判断并输出值,所以表达式的结果必须是boolean值
true - 将值1赋值给变量
false- 将值2赋值给变量
int a=10; int b=20; int num = (a>b)?a:b; System.out.println(num);//num=20
举例:在控制台输入三个int类型的数据,判断大小,由小到大输出
import java.util.Scanner; public class Test{ public static void main(String[] args){ 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;//int max =((a>b)?a:b)>c)?((a>b)?a:b):c; max = (max>c)?max:c; //最小值 int min = (a<b)?a:b;//int min =((a<b)?a:b)<c)?((a<b)?a:b):c min = (min<c)?min:c; //中间值 int mid = a+b+c-max-min; System.out.println(min + "<" + mid + "<" + max); } }
三目运算符返回值规则:
1.值1和值2都是常量的情况,按照取值范围大的类型返回数据
2.值1和值2都是变量的情况,按照取值范围大的类型返回数据
3.值1和值2一个是常量一个是变量的情况,判断常量是否在变量所属类型的取值范围里
在 - 按照变量类型返回数据
不在-按照常量类型返回数据
7.位运算符
符号:
&与 |或 ^异或
<< 左移
>> 右移
>>> 无符号位右移
理解:
将十进制的数据转换为二进制再做运算
- &与:同位比较,两者为1,结果才为1
byte a=19,b=23; System.out.println(19 & 23);//0000 0000 0000 0000 0000 0000 0001 0011 19 //0000 0000 0000 0000 0000 0000 0001 0111 23 //0000 0000 0000 0000 0000 0000 0001 0011 19
- |或:同位比较,两者有1,结果就为1
byte a=19,b=23; System.out.println(19 | 23);//0000 0000 0000 0000 0000 0000 0001 0011 19 //0000 0000 0000 0000 0000 0000 0001 0111 23 //0000 0000 0000 0000 0000 0000 0001 0111 23
- ^异或:同位比较,两者相同为0,不同为1
System.out.println(19 ^ 23);//0000 0000 0000 0000 0000 0000 0001 0011 19 //0000 0000 0000 0000 0000 0000 0001 0111 23 //0000 0000 0000 0000 0000 0000 0000 0100 4
注意:
&、|、^前后两侧都是数值,该符号为位运算符
&、|、^前后两侧都是boolean值,该符号为逻辑运算符
<<左移:整体向左移动n位,就用n个0补到最低位
左移一位相等于乘2
System.out.println(3 << 2);//0000 0000 0000 0000 0000 0000 0000 0011 3 //0000 0000 0000 0000 0000 0000 0000 1100 12
>>右移:整体向右移动n位,就用n个符号位补到最高位
右移一位相等于除2
System.out.println(3 >> 2);//0000 0000 0000 0000 0000 0000 0000 0011 3 //0000 0000 0000 0000 0000 0000 0000 0000 0
- >>>无符号位右移:
注意:无符号位右移和右移在处理正数的情况下没有区别,负数用0补位。
System.out.println(-3 >>> 1);//1111 1111 1111 1111 1111 1111 1111 1111 1101 -3 //0111 1111 1111 1111 1111 1111 1111 1111 1110 2,147,483,646
8.运算符的优先级别
**注意:**不要死记,灵活使用小括号。
二、Scanner类(浅用)
类:是一个抽象的概念,在现实中并不存在。
Scanner类:Java给我们提供的专门用于在控制台输入数据的类、
使用步骤:
- 导包:import java.util.Scanner;
- 创建对象:Scanner scan = new Scanner(System.in);
- 调用方法(功能):int num = scan.nextInt();
细节:
使用Java提供的类需要在java文件中的第一行导入包
使用功能必须要先创建对象
创建对象 类型 引用 = 新建的对象
Scanner scan = new Scanner(System.in);
方法介绍:调用方法必须使用对象所对应的引用进行调用
int num = scan.nextInt();
在窗口输入一个整数类型数字并赋值给程序中的num变量
double num = scan.nextDouble();
在窗口输入一个浮点类型数字并赋值给程序中的num变量
String str = scan.next();
在窗口输入一个字符串并赋值给程序中的str变量
方法调用几次,就可以在窗口输入几次
//导包 import java.util.Scanner; public class Test{ public static void main(String[] args){ //创建Scanner类的对象 //类 类名 = 新建 类(); Scanner scan = new Scanner(System.in); System.out.println("请输入int类型的数据:"); int i = scan.nextInt();//用户可以在控制台输入数据,并把数据赋值给i System.out.println("请输入double类型的数据:"); double d = scan.nextDouble(); System.out.println("请输入字符串类型的数据:"); String str = scan.next(); //输出 System.out.println(i); System.out.println(d); System.out.println(str); } }