一.运算符
定义:运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
分类:算数运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符。
1.算数运算符的测试用例:
/*运算符:
-
-
-
- % (前)++ (后)++ (前)-- (后)-- +(拼接运算)
-
-
-
*/
public class Ari_Test {
public static void main(String[] args) {
// / 除号运算(数学运算中取商)
int num = 14;
int num1 = 4;
int result = num / num1;
//做除法运算时,两整型做除法运算,结果取整,舍弃小数点,不进行进位操作double result1 = num / num1; //输出2.0,当想得到除法精确得数值得时候,我们可能会想到用一个double数据类型得结果来接收结果,但是实际上只是将结果转换成了double型,实际运算结果值不变 double result2 = num / num1 + 0.0; //输出2.0 double result3 = num / (num1 + 0.0); //输出精确结果2.4,括号运算符里面得算术运算首先进行,num1 + 0.0,运用自动类型提升规则,int + double = double,int / double = 精准double数值 double result4 = (double) num / num1; //输出精确结果2.4,和上面原理相同,精确把握自动类型提升运算本质 System.out.println(result); // % 取模运算(数学运算种取余运算) //取模结果与被除数符号一致 //开发中,常使用%来进行判断,判断某数能否被除尽(余数位0) int m1 = 12; int n1 = 5; System.out.println("m1 % n1 =" +m1 % n1); //2 int m2 = -12; int n2 = 5; System.out.println("m2 % n2 =" +m2 % n2); //-2 int m3 = 12; int n3 = -5; System.out.println("m3 % n3 =" +m3 % n3); //2 int m4 = -12; int n4 = -5; System.out.println("m4 % n4 =" +m4 % n4); //-2 //(前)++ 先自增1,后调用进行运算 (两者都表示自增1) //(后)++ 先调用直接参与运算,后自增1 int a1 = 10; int b1 = ++a1; //a1先++之后为11,再赋值给变量b1 System.out.println(a1); //11 System.out.println(b1); //11 int a2 = 10; int b2 = a2++; //先调用a2,先直接赋值给b2之后,才进行了a2得自增操作 System.out.println(a2); //11,此时已自增完成后,a2得值变成了11 System.out.println(b2); //10 //注意点: short s = 10; //s = s + 1; 编译失败,char、byte、short任意之间两两运算或者与整型常量进行运算,结果都是int型得,不能用short型来接收结果 //s = (short)(s + 1) 正确得,int->short,大容量数据转向小容量数据,运算强制类型转换符,进行强制类型转换 s++; //自增1,不会改变原数据本身得数据类型,这种用法效率更高,不需要进行强转截断操作 //(前)-- 先自减1,后调用进行运算 (两者都表示自减1) //(后)-- 先调用直接参与运算,后自减1 int o1 = 10; int p1 = --o1; System.out.println("o1 = "+ o1 +" p1 = "+ p1); //9,9 int o2 = 10; int p2 = o2--; System.out.println("o2 = "+ o2 +" p2 = "+ p2); //9,10
}
}
2.赋值运算符
赋值运算符号"=" = += -= /= %=
赋值运算符测试用例
public class SetValue_Test {
public static void main(String[] args) {
int j1,j2; //连续定义变量
j1 = j2 = 10; //连续从右向左赋值
int j3 = 20,j4 = 20; //连续单一赋值//******************> int num = 6; num += 2; //等效于num = num + 2; System.out.println(num); //8 int num1 = 5; num1 %= 2; //等效于num1 = num1 % 2; System.out.println(num1); //1 //注意:上述运算符除了单个赋值运算符之外,剩下得双层赋值运算符,运算前后都不会改变变量本身得数据类型 short num2 = 8; //num2 = num + 2; 编译不通过,short + int = int,需要进行类型提升,使用int型数据类型变量来接收结果 num2 += 2; //等效于num2 = num2 + 2; System.out.println(num2); //10 //开发中,如果要希望变量实现+2得操作,有几种方法?(前提 : int num = 10;) //方式1:num = num + 2; //方式2:num += 2;(推荐)此种赋值方式不仅赋值前后不会改变数据类型,并且在数据类型为byte、short、char数据类型得时候,不会造成强转,造成精度损失得情况,并且代码量也比较少 3.比较运算符 == != > < >= <= instanceof(判断某个对象是否是一个类得实例) * 结论:
-
1.比较运算符得运算结果都是布尔boolean类型得数值,true或者false
-
2.区分"==“和”="
-
*/
public class Comparable_Test {
public static void main(String[] args) {
int i = 10;
int j = 20;
System.out.println(i == j); //false,"==“为比较运算符,基本数据类型比较得是两个数值得值是否相等,引用数据类型比较得是两对象变量得首地址,判断结果为true或者false
System.out.println(i = j); //20,单个”="号代表得是赋值运算符,从右向左进行运算,代表得是将赋值运算符右边得值赋给左边得变量,会对该变量原先存储得值进行覆盖
}
}
4.逻辑运算符。
& && | || ! ^
说明: -
1.逻辑运算符操作的都是布尔boolean类型的变量
-
*/
public class LogicTest {
public static void main(String[] args) {
//区分 & 和 &&
//相同点1:& 和 &&运算结果相同
//相同点2:当符号左边都是true的时候,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边的操作
// 当符号左边是false时,&&不再执行符号右边的操作
//开发中,推荐使用&&
boolean b = false;
int num = 10;
if(b & (num++ > 0)) {
System.out.println(“A”);
}else {
System.out.println(“B”); //B
}
System.out.println(num); //11boolean b1 = false; int num1 = 10; if(b1 && (num1++ > 0)) { System.out.println("A"); }else { System.out.println("B"); //B } System.out.println(num1); //10 //区分: | 和 || 与 & 和 &&运算规则相同 //相同点1:| 和 ||的运算结果都是相同的 //相同点2:当符号左边都是false,两者右边的运算都会执行 //不同点:当符号左边是true的话,|右边还是会继续执行的 // 当符号左边是true的话,||右边就不会继续执行了 //开发中,推荐使用|| boolean b2 = true; int num2 = 10; if(b | (num2++ > 0)) { System.out.println("A"); //A }else { System.out.println("B"); } System.out.println(num2); //11 int num3 = 10; if(b || (num++ > 0)) { System.out.println("A"); //A }else { System.out.println("B"); } System.out.println(num3); //10
}
}
5.位运算符
-
结论**
(1)位运算符操作的都是整型的数据
(2)位运算符进行的操作都是在二进制数的基础上进行的(移动位数不能过大,否则超过了数据类型的范围的话,数值会变成负数)
经典面试题:最高效的方式计算2 * 8?2 << 3 或 8 < 1
例:十进制的21转换成二进制数位(0001 0101)
21 << 2:0101 0100 结果为84。在一定范围内,左移几位就相当于在原数的基础上 * 2^移动位数倍。
21 >> 1:0000 1010 结果为10。在一定范围内,右移几位就相当于在原数的基础上 / 2^移动位数倍。
6.三元运算符
1.结构:(条件表达式)?表达式1:表达式2;
-
2.说明:
-
(1)条件表达式的结果为布尔boolean类型数值
-
(2)根据条件表达式的真或假,来判断执行的表达式为表达式1还是表达式2
-
条件表达式结果为真(true)时,表达式1的值就是需要的值,执行表达式1
-
条件表达式结果为假(false)时,表达式2的值就是需要的值,执行表达式2
-
(3)表达式1和表达式2是一致的。
-
(4)三元运算符是可以嵌套的
-
3.凡是可以使用三元运算符的地方,都可以改写成if-else语句
-
反之,不成立。
-
4.如果条件判断语句既可以使用三元运算符,if-else语句来写的话,优先推荐使用三元运算符
-
因为三元运算符执行效率更高,更简洁。
-
*/
public class SanYuan_Test {
public static void main(String[] args) {
//获取两个正整数的较大值
int m = 12;
int n = 5;
int max = m > n?m : n;
System.out.println(max); //12//int max = m > n?2 : 1.0; 编译出错,三元运算符在进行赋值运算之前,表达式1和表达式2的值会进行数据类型比较,较小容量数据会自动向较大容量数据进行自动类型提升 double max1 = m > n?2 : 1.0; //所以,运算结果,也需要用较大容量的数据类型变量来接收 //************************************* String maxStr = m > n?"m大":(m == n)?"m和n一样大":"n大"; System.out.println(maxStr); //m大 //************************************* //获取三个数的最大值 int n1 = 15; int n2 = 66; int n3 = -36; int max2 = n1 > n2?n1 : n2; int max3 = max2 > n3?max2 : n3; System.out.println(max3); //66 //不建议这样使用,可读性差,效率低。 int max4 = n1 > n2?(n1 > n3?n1 : n3):n2; System.out.println(max4); //66
}
}
二.循环
1.程序流程控制
1.1 if-else语句
分支结构中的if - else(条件判断结构)使用方法:
第一种:单选(当且仅当条件表达式为真时,才进入内部执行执行语句,否则不执行)
if(条件表达式 ){
执行语句;
}
第二种:二选一(肯定会执行一个,当条件表达式为真时,执行执行语句1,否则执行执行语句2)
if(条件表达式){
执行语句1;
}else{
执行语句2;
}
第三种:多选一(肯定会执行一个,具体执行请参照二选一)
if(条件表达式1){
执行语句1;
}else if(条件表达式2){
执行语句2;
}else if(条件表达式3){
执行语句3;
}…(条件表达式n - 1){
执行语句n - 1;
}else{
执行语句n;
}
1.2 swich-case结构
switch(表达式){ //这里的表达式并非是一个条件表达式,而是一个常量
case 常量1:
执行语句1;
break; //非必要,根据情况决定是否去添加
case 常量2:
执行语句2;
break;
…
default:
执行语句n;
break; //可加可不加,本身已经到达表达式最后了,必然会跳出判断语句
}
-
说明:
(1)根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case执行结构中的执行语句去执行,当调用完执行语句以后,则仍然继续向下执行其他case中的执行语句,直到遇到break关键字或者执行完最后一个default的执行语句末尾才会结束执行
(2)default默认执行语句只有在前面的所有case语句都未匹配的情况下才会执行,并且执行语句之后的break可加可不加,因为此执行语句本身就在末尾,执行完此执行语句之后,会默认跳出switch - case条件判断语句
(3)break关键字,可以使用到switch - case结构中,表示一旦遇到此关键字,就跳出条件判断语句
(4)switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
(5)case之后只能声明常量,不能声明一个范围(条件判断语句)
(6)break关键字是可选的
(7)default可以理解成相当于if - else条件判断语句中的else(兜底执行操作)。
default结构式可选的。并且default的位置可以是任意的,并且不影响执行结果。
二.循环结构- 定义:在某些条件满足的情况下,反复执行特定代码的功能
-
分类:
for循环
while循环
do - while循环
-
循环语句的四个组成部分(要素):
(1)初始化部分
(2)循环条件部分 —>是boolean类型
(3)循环体部分
(4)迭代部分
-
执行顺序:
(1)初始化部分(只执行一次,进入循环条件,对变量的初始值进行定义)
(2)循环条件部分(可多次进行判断,直到条件不再满足的情况下就跳出循环,接着执行接下来的顺序执行语句)
(3)循环体部分(进行循环体内部多次反复执行的语句)
(4)迭代部分(对初始化的部分进行迭代,可以理解为为初始化条件多次进行改变,改变之后判断循环条件是否满足,满足则继续执行,不满足就跳出循环,接着循序执行之后的代码)
2.1 for循环结构
格式:
for((1)初始化条件;(2)循环条件;(3)迭代条件){
(4)循环体;
}
-
执行顺序:[ (1)-(2)-(4)-(3) ]、[ (2-(4)-(3) ]、[ (2)-(4)-(3) ] (2、4、3不断重复执行)、(2),直到最后累加的迭代条件不在满足循环条件的时候则跳出循环
2.2 while循环结构 -
循环语句的四个组成部分(要素):
(1)初始化部分
(2)循环条件部分 —>是boolean类型
(3)循环体部分
(4)迭代部分
-
while循环得结构:
(1)
while( (2) ){
(3); (4);
}
-
执行顺序和for循环相同:[ (1)-(2)-(4)-(3) ]、[ (2)-(4)-(3) ]、[ (2)-(4)-(3) ] (2、4、3不断重复执行)、(2),直到最后累加的迭代条件不再满足循环条件的时候则跳出循环
说明:
1.写while循环千万不能忘记写迭代得条件,否则会一个变量值无法进行迭代,反复执行执行条件,没有跳出条件,造成死循环!
2.我们写程序,要避免死循环。
3.for循环和while循环是可以相互转换得!
4.for循环和while循环得初始化条件不同
for循环条件内定义得变量i只能在for循环之内有效调用,while循环初始化条件定义在外部,初始化条件变量也可以进行调用,在一整个函数之内有效调用。
2.3 do - while循环
-
循环语句的四个组成部分(要素):
(1)初始化部分
(2)循环条件部分 —>是boolean类型
(3)循环体部分
(4)迭代部分
-
结构:
(1)
do{
(3)
(4)
}while( (2) );
-
执行过程:(1) - (3) - (4) - (2) - (3) - (4) - … - (2)
-
说明:
(1)do - while循环至少会执行一次循环体!(不管三七二十一,进去先执行一次循环体,之后在进行判断条件是否满足循环条件)
(2)开发中,大多使用for循环和while循环进行循环语句的执行,较少使用do - while语句
2.4 循环语句中的关键字break和continue。- break关键字得适用范围: 循环中使用得作用(不同点) 相同点
- switch - case语句
- 循环结构中 结束当前循环 关键字后面不能声明执行语句
-
continue关键字得适用范围:
- 循环结构中 结束当次循环 关键字后面不能声明执行语句