一、运算符
1、算数运算符
1、基础
符号:加 +、减 -、乘 *、除/、取模%、自增++、自减–
int a = 10;
int b = 3;
int result = a + b;
System.out.println(result);//13
System.out.println(a + b);//13
System.out.println(10 + 3);//13
System.out.println(10 - 3);//7
System.out.println(10 * 3);//30
System.out.println(10 / 3);//int类型取整数
System.out.println(10 % 3);//1 最终结果为除了之后的余数
//++:自增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、特殊点1
//特殊点1:byte做运算,会向上转型成int,再做运算
byte b1 = 10;
byte b2 = 20;
//b1=10;-- byte:0000,1010
//(int)10:0000,0000,0000,0000,0000,0000,0000,1010
//byte b2=20:0001,0100
//(int)20:0000,0000,0000,0000,0000,0000,0001,0100
byte result = (byte)(b1+b2);
//b1+b2 结果为int类型:0000,0000,0000,0000,0000,0000,0001,1110
//强制转型为(byte):0001,1110
System.out.println(result);
2、特殊点2
//特殊点2:short做运算,会向上转型成int,再做运算
short s1 = 10;
short s2 = 20;
//s1 -- short:0000,0000,0000,1010
//(int):0000,0000,0000,0000,0000,0000,0000,1010
//s2 -- short:0000,0000,0001,0100
//(int):0000,0000,0000,0000,0000,0000,0001,0100
short result = (short)(s1+s2);
// 结果:0000,0000,0000,0000,0000,0000,0001,1110
//(short):0000,0000,0001,1110
System.out.println(result);
3、特殊点3
//特殊点3:除了byte和short做运算会转型成int,其他数值类型做运算会按照取值范围大的类型转型后再做运算
byte b = 10;
short s = 10;
int i = 10;
long l = 10;
float f = 10;
double d = 10;
System.out.println(b + b);//结果是int类型
System.out.println(b + s);//结果是int类型
System.out.println(b + i);//结果是int类型
System.out.println(s + i);//结果是int类型
System.out.println(i + l);//结果是long类型
System.out.println(s + l);//结果是long类型
System.out.println(i + f);//结果是float类型
System.out.println(l + f);//结果是float类型
System.out.println(l + d);//结果是double类型
System.out.println(f + d);//结果是double类型
4、特殊点4
//特殊点4:浮点类型做运算可能会失去精度,失去精度问题可以使用 BigInteger或BigDecimal去解决
double d1 = 0.5;
double d2 = 0.4;
System.out.println(d1-d2);//0.09999999999999999998
5、特殊点5
//特殊点5:++a; 和 a++; 没有区别,因为分号为执行语句的结束符,不管先加还是后加都给我自增1
int a = 10;
//++a;
a++;//10
System.out.println(a);//11
6、特殊点6
//特殊点6:++底层会强壮
int a = 10;
++a;//底层实现:a = (int)(a+1);
System.out.println(a);//11
7、特殊点7
//特殊点7:char类型可以做算数运算
char c = 'a';//'a'字符的码值是97
System.out.println(c+1);//98
8、特殊点8
//特殊点8:boolean不能与其他类型兼容
boolean bool = true;
System.out.println(bool + 1);
3、深入理解
经典题一:输出结果为?
int a = 8;
int b = (a++)+(++a)+(a*10);
//在这个加号之前是9,加号之后为10
//a = 10
//b = 8 + 10 + 100
System.out.println(b);//118
经典题二:输出结果为?
int i = 0;
//底层原理:
//i = (int)(i+1);
//i = i;
i = ++i; //先自增再赋值给i
System.out.println(i);//1
经典题三:输出结果为?
int i = 0;
底层原理:
//int temp = i; -- temp作为临时变量,记录了i最初始的值-0
//i = (int)(i+1); -- 变量i确实自增了
//i = temp; -- 将temp赋值给i,i又变回了原来的值
//也可以这样理解,i++是先使用后赋值,相当于就是先把i的值赋值给i,然后右边的i自增
i = i++;
//但是因为已经完成赋值,所以下面的i还是0
System.out.println(i); //先使用再自增,目前还是0
2、赋值运算符
1、符号
=、 +=、 -=、 *=、 /=、 %=
1、基础
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);//1
2、深入理解
经典题一:输出结果为?
int a,b; //一次性声明多个变量
a = b = 100;//1.将100赋值给b 2.将b中数据赋值给a
System.out.println(a); //100
System.out.println(b); //100
经典题二:下面的两种写法结果分别是?
short s = 1;
s = s+1;
//会报错,因为short类型的数据和int类型的数据做运算,会向上转型成int
short s=1;
s += 1;//不会报错
3、赋值规则
赋值规则:
s += 1
s = (short)((s) + (1))
//复合赋值 E1 op= E2等价于简单赋值
//E1 = (T)((E1)op (E2)),其中T是E1的类型。
3、关系运算符
1、符号
==、 !=、 >、 >=、 <、 <=、 =
等于、不等于、大于、大于等于、小于、小于等于 赋值
2、基础
boolean bool = 10 == 5;
//声明布尔类型的变量 bool 给bool进行赋值,判断10等于5是否十正确
System.out.println(bool);//false
System.out.println(10 != 5);//true
//理解:系统输出打印10不等于5的结果
System.out.println(10 > 5);//true
//理解:系统输出打印10大于5的结果
System.out.println(10 >= 5);//true
//理解:系统输出打印10大于等于5的结果
System.out.println(10 < 5);//false
//理解:系统输出打印10小于5的结果
System.out.println(10 <= 5);//false
//理解:系统输出打印10小于等于5的结果
3、深入理解
//经典题一:输出结果为?
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、小结
关系运算符的结果都是boolean值
=为赋值号,将赋值号右边的数据赋值给左边的变量,他是赋值运算符
==表示判断两个值是否相同,他是关系运算符
!=表示判断两个值是否不相同,感叹号是英文
4、逻辑运算符
1、符号
&(与)、&&(短路与)
|(或) 、||(短路或)、
!(非)、
^(异或)。
2、基础
//&与:前后两侧都是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
//& vs &&
//&与:判断前者为false后,还会判断后者
//&&短路与:判断前者为false后,不会判断后者,直接返回false,所以效率更高
//ArithmeticException - 算数异常
System.out.println(false && 10/0>3);
//|或:前后两侧都是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
//| vs ||
//|或:判断前者为true后,还会判断后者
//||短路或:判断前者为true后,不会判断后者,直接返回true,所以效率更高
System.out.println(true || 10/0>3);
//^异或:前后两侧都是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
3、理解
3、理解
& 和 && 理解:两个有一侧为false,结果为false
| 和 || 规则 :两侧有一侧为true,结果为true
^ 规则:两侧相同为false,不同为true
!规则:置反,false变成true , true变成false
4、注意
逻辑运算符运行结果都是boolean类型
&、&&、|、||、^ 两侧都是boolean类型数据
5、三目运算符/三元运算符
1、语法
变量 = (表达式)?值1:值2
2、理解
表达式的结果必须是boolean值
true - 将值1赋值给变量
false- 将值2赋值给变量
3、案例
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;//判断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();
int min = (a<b)?a:b;
System.out.println("最小值为:" + min);
4、案例四
//在控制台输入三个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);
4、扩展
1、三目返回值规则
1.值1和值2都是常量的情况,按照取值范围大的类型返回数据
2.值1和值2都是变量的情况,按照取值范围大的类型返回数据
3.值1和值2一个是常量一个是变量的情况,判断常量是否在变量所属类型的取值范围里
在 - 按照变量类型返回数据
不在-按照常量类型返回数据
2、扩展题型
//扩展题1: System.out.println((false)?10.9:9);//9.0 //扩展题2: char x = 'x';//码值 - 120 int i = 10; System.out.println(false?i:x);//120 //扩展题3: char x = 'x';//码值 - 120 System.out.println(false?100:x);//x System.out.println(false?100000:x);//120
6、字符串拼接符
1、符号
+号
2、理解
public static void main(String[] args){
//从左到右依次执行,前面是数字之间的相加,遇到字符串然后开始凭借
System.out.println(1 + 2 + "abc" + "def" + 1 + 2);
// 3 + "abc" + "def" + 1 + 2
// "3abc" + "def" + 1 + 2
// "3abcdef" + 1 + 2
// "3abcdef1" + 2
// "3abcdef12"
}
3、注意
+两侧都是数值,该符号为算数运算符
+两侧有一侧或两侧是字符串,该符号为字符串拼接符
7、位运算符
1、符号
&与 |或 ^异或 << 左移 > >右移 >>> 无符号位右移
2、理解
将十进制的数据转换为二进制做运算符
3、案例表述
1、案例( & )
//&与:同位比较,两者为1,结果才为1
byte b1 = 19;//0001,0011
byte b2 = 21;//0001,0101
//0001,0001
//b1 - byte:0001,0011
// int:0000,0000,0000,0000,0000,0000,0001,0011
//b2 - byte:0001,0101
// int:0000,0000,0000,0000,0000,0000,0001,0101
// int:0000,0000,0000,0000,0000,0000,0001,0001
// (byte):0001,0001
byte result = (byte)(b1 & b2);
System.out.println(result);//17 - 0001,0001
2、案例( I 或 )
//|或:同位比较,两者有1,结果就为1
int i1 =19;//0000,0000,0000,0000,0000,0000,0001,0011
int i2 =21;//0000,0000,0000,0000,0000,0000,0001,0101
//0000,0000,0000,0000,0000,0000,0001,0111
System.out.println(i1 | i2);//23
3、案例( ^异或 )
//^异或:同位比较,两者不同为1,相同为0
int i1 =19;//0000,0000,0000,0000,0000,0000,0001,0011
int i2 =21;//0000,0000,0000,0000,0000,0000,0001,0101
//0000,0000,0000,0000,0000,0000,0001,0110
System.out.println(i1 ^ i2);//6
4、案例左移
//<<左移:整体向左移动n位,就用n个0补位(补到最低位)
//注意:左移一位相等于乘2
int i=1024;//0000,0000,0000,0000,0000,0100,0000,0000
//0000,0000,0000,0000,0001,0000,0000,0000
System.out.println(i << 2);//4096
5、案例右移
//>>右移:整体向右移动n位,就用n个最高位/符号位补位(补到最高位)
//注意:右移一位相等于除2
int a=1024;//0000,0000,0000,0000,0000,0100,0000,0000
//0000,0000,0000,0000,0000,0001,0000,0000
System.out.println(a >> 2);//256
int b=-1024;//1111,1111,1111,1111,1111,1100,0000,0000
//1111,1111,1111,1111,1111,1111,0000,0000
System.out.println(b >> 2);//-256
6、案例无符号为右移
//>>>无符号位右移:整体向右移动n位,就用n个0补位(补到最高位)
//注意:>>和>>>在处理正数的情况下没有区别
int c=1024;//0000,0000,0000,0000,0000,0100,0000,0000
//0000,0000,0000,0000,0000,0001,0000,0000
System.out.println(c >> 2);//256
int d=-1024;//1111,1111,1111,1111,1111,1100,0000,0000
//0011,1111,1111,1111,1111,1111,0000,0000
System.out.println(d >>> 2);//1073741568
8、表达式
5+6:算数表达式
5>6:关系表达式
5|6:位运算表达式
9、Scanner类
1、简介
Java给我们提供的专门用于在控制台输入数据的类
2、使用步骤
导包:import java.util.Scanner;
创建对象:Scanner scan = new Scanner(System.in);
调用方法(功能):int num = scan.nextInt();
3、细节
使用Java提供的类需要在java文件中的第一行导入包
使用功能必须要先创建对象
创建对象 类型 引用 = 新建的对象
Scanner scan = new Scanner(System.in);
方法介绍:调用方法必须使用对象所对应的引用进行调用
int num = scan.nextInt();
在窗口输入一个整数类型数字并赋值给程序中的num变量
double num = scan.nextDouble();
在窗口输入一个浮点类型数字并赋值给程序中的num变量
String str = scan.next();
在窗口输入一个字符串并赋值给程序中的str变量
5.方法调用几次,就可以在窗口输入几次
4、举例
//导包 import java.util.Scanner; public class Test09{ /** 知识点:Scanner类 理解:Java给我们提供的专门用于在控制台输入数据的类 */ public static void main(String[] args){ //创建Scanner类的对象 //人类 某人 = 新建 人类(); Scanner scan = new Scanner(System.in); System.out.println("请输入int数据:"); int i = scan.nextInt(); System.out.println("请输入double数据:"); double d = scan.nextDouble(); System.out.println("请输入String数据:"); String str = scan.next(); //系统打印输出输入的值 System.out.println(i); System.out.println(d); System.out.println(str); } }