Java基础(二)
运算符
-
算术运算符 含义 + 加法运算、字符串拼接运算、正数 - 减法运算、负数 * 乘法运算、通配符 / 除法运算(求商数) % 除法运算(取余数、取模运算) ++ 自加一运算 - - 自减一运算 -
比较运算符
比较运算符 含义 == 相等比较 < 小于比较 > 大于比较 >= 大于等于比较 <= 小于等于比较 != 不等于比较 备注:比较运算符,运算的结果都是布尔类型值true、false。
注意事项:
如果我们进行多次判断,不能连着写
数学当中,a<3 a > -1—–> -1 < a < 3
在程序当中,【不允许】这种操作。
-
赋值运算符
赋值运算符 含义 = 赋值 += 加等于 -= 减等于 *= 乘等于 /= 商等于 %= 模等于 备注: 1.重点掌握【=】基本赋值运算符
2.剩下的都是复合赋值运算符
3.只有变量才可以使用赋值运算符,常量不能进行赋值
4.复合赋值运算符其中隐含了一个强制类型转换。
-
逻辑运算符
逻辑运算符 含义 &&短路与 1.如果两边都是true,结果为true;2.如果一边为false,结果就是false ||短路或 1.如果两边任意一边是true,结果则为true,否则为false !取反(取非) 如果为false,结果为true;反之则为false ^ 如果两边有且只有一个为true,结果为true,否则为false - 位运算符
运算符 | 含义 | 示例 |
---|---|---|
<< | 左移 | 5 << 2 = 20 —>52^2 = 5 4 =20 |
>> | 右移 | 5>>1 = 2—>5 / 2^1= 2 |
>>> | 无符号右移 | 5>>>1 = 2 —>5 / 2 = 2 |
& | 与运算(只要有一个为0,运算结果就为0,否则为1) | 5 & 3 = 1 |
| | 或运算(只要有一个为1,运算结果就为1,否则为0) | 5 | 3 = 7 |
^ | 异或运算(XOR 同为0,异为1 如果两个数值一样,运算结果为0,如果两个数值不一样,运算结果就为1) | 5 ^ 3 = 6 |
~ | 取反运算(了解一下就行) | ~6 –> 0110 = -7 |
备注:位运算计算机底层采用的是对整数进行二进制运算。
【没有无符号左移位运算符】
当两个二进制的位数不一致时,在短的那一方高位补0
二进制整数表示:原码、补码、反码、补码
三目运算符
三目运算符格式:
布尔类型表达式 ? 真的结果值 : 假的结果值
三目运算符格式:
变量的数据类型 变量名 = 布尔类型表达式 ?真的结果值 : 假的结果值
计算方式:
如果布尔类型表达式结果是true,三目运算符运算的结果为紧邻?后面的值;
如果布尔类型表达式结果是false,三目运算符运算的结果为紧邻:后面的值。
备注:当三目运算符运算参与有其他的运算(赋值运算),要求三目运算符中的?和:后面的值的【数据类型保持一致】。
流程控制
顺序结构
程序是从上往下进行加载,按照代码的编写顺序进行执行。
选择结构(分支结构)
-
if 单支情况
if语句的格式:
if(布尔类型表达式/布尔类型值){
//语句体。。。。。。
}
if语句(单支)的执行流程:
-
首先判断布尔类型表达式看它的结果是false还是true
-
如果是true就执行{}里面的方法体内容
-
如果是false就不执行{}里面的方法体内容,程序往后加载。
-
-
if else多支情形
格式:
if(布尔类型表达式){
//语句体内容1;
}else{
//语句体内容2;
}
if else多支语句的执行流程:
-
首先判断布尔类型表达式看它的结果是true还是false
-
如果是true,就执行语句体内容1
-
如果是false,就执行语句体内容2
-
-
if … else if …else
格式:
if(布尔类型表达式1){
//方法体内容11.。。。。。
}else if(布尔类型表达式2){
//方法体内容2.。。。。。
}
……
else if(布尔类型表达式n){
// 方法体内容n.。。。。。
}else{
//方法体内容n+1。。。。。。
}
执行流程:
-
首先判断布尔类型表达式1看其结果是true还是false
-
如果是true,就执行方法体内容1
-
如果是false,就继续判断布尔类型表达式2,看其结果是true还是false
-
如果是true,就执行方法体内容2
-
如果是false,就继续判断布尔类型表达式……,看其结果是true还是false
-
……
-
如果以上所有的布尔类型表达式都为false,最后执行else{}里面的方法体内容n+1。
-
-
if...if...else...else语句 嵌套情形
格式:
if(布尔类型表达式1){
//方法体内容1
。。。。。。
if(布尔类型表达式2){
//方法体内容2
。。。。。。
}else{
//方法体内容3
}
}else{
//方法体内容4
}
执行流程:
-
首先判断布尔类型表达式1,看其结果是true还是false
-
如果是true,就执行方法体1,再继续判断布尔类型表达式2,看起结果是true还是false,如果是true就执行方法体2。如果是false,就执行方法体内容3。。。。。。
-
-
if语句和三目运算符的互换
int num01 = 10;
int num02 = 20;
//定义一个变量,保存num01和num02的最大值
int c;
if(num01 > num02){
c = num01;
}else{
c = num02;
}
//上面的语句我们也可以使用三目运算符
c = num01 > num02 ? num01 : num02;
switch case语句
格式:
switch(表达式){
case 常量值1:
//语句体内容1
break;
case 常量值2:
//语句体内容2
break;
......
default:
//语句体n
break;
}
执行流程:
-
首先计算出表达式中的值
-
其次,依次和case后面的常量值作比较,一旦有对应的值,就会执行相应的语句体内容,
在执行的过程中,遇到break就会结束switch case语句。
-
最后,如果所有的case都和表达式的值不匹配,那么就会执行default中的语句体内容
注意:switch语句中,表达式的数据类型,可以是byte/short/int/char/enum(枚举),JDK1.7之后可以接受字符串类型。
case穿透性
在switch语句,如果case后面的break省略掉,将会出现穿透现象不会判断后面的case情形值,直接加载后面的case中的方法体内容,
直到遇到break结束。
循环结构【重点】
【三种基本循环】for、while、do-while
循环结构组成部分:一般可以分成四部分
1.初始化语句:在循环最初开始时,需要定义一个初始化的变量,而且只会定义一次。
2.条件判断(结束条件):如果条件成立满足,进入循环,如果条件不满足,则跳出循环
3.循环体内容:重复要做的事情内容,可能包含很多条语句(事情是有规律的)
4.迭代语句(步进语句):每次循环结束之后需要执行步进语句(迭代语句),对初始化的变量做步进(迭代)。
for循环语句结构
结构:
for(1.初始化语句;2.条件判断表达式;4.迭代语句){
//循环体内容
}
执行顺序:
执行顺序:1—>2—>3—>4—>2—>3—>4—>2—>3—>……2不满足为止。
1.赋值循环变量的初始化
2.负责判断是否满足循环条件,不满足退出循环
3.负责执行具体的语句(逻辑功能)
4.负责变量的迭代
初始化语句一定和条件判断表达式紧密结合 ,迭代语句和条件判断表达式也是紧密结合, 迭代语句是对初始化语句中定义的变量迭代的。
while循环语句
//1.初始化语句;
while(2.判断条件){
//3.循环体内容
//4.步进语句;
}
执行流程:
-
执行顺序:1—->2——>3——>4——>2——>3——>4——>……2不满足为止
-
1.负责循环变量初始化
-
2.负责判断是否满足循环条件,不满足则跳出循环
-
3.负责执行具体语句,实现某个功能。
-
4.迭代循环变量
do-while循环
格式:
//1.初始化语句
do{
//3.循环体内容
//4.迭代语句
}while(2.判断条件);
执行流程:
-
执行顺序:1—>3—->4—->2——>3——>4——>……2不满足为止
-
1.负责定义循环变量并且进行初始号
-
2.负责判断是否满足循环条件,不满足则跳出循环
-
3.负责执行具体语句,实现某个功能
-
4.迭代循环变量
备注:无条件执行一次循环体内容,即使判断条件是不满足也依然循环一次,这样的循环是有风险的,对初学者来说不建议使用。
循环语句的区别
for 和 while的区别
-
控制语句中所涉及到的循环变量,当for循环结束后,定义的循环变量不能再被访问到,而while循环结束后依然可以被访问到。如果不继续使用循环变量,建议使用for循环,因为for循环结束后,循环变量就会从内存中消失,能够提高内存的使用效率。
-
在已知循环次数的条件下,建议使用for循环,当循环次数不确定时使用while循环。
##跳出语句
break、continue两个语句
break
使用的情形:终止switch或者循环语句
备注:离开了使用场景对于break来说没有意义。
public static void main(String[] args){
//使用break语句
//跳出循环语句
//10以内的偶数和
int sum = 0;
for(int i = 0; i <= 1000; i ++){
//跳出情形 i > 10
if(i>10){
break;
}
if( i % 2 == 0){
sum += i;
}
}
//跳出switch case 语句
//季节 四个季节
String season = "春季";
switch(season){
case "春季":
System.out.println("万物复苏");
break;
case "夏季":
System.out.println("烈日炎炎的时候");
break;
case "秋季":
System.out.println("丰收的时候");
break;
case "冬季":
System.out.println("寒冷下雪时候");
break;
default:
System.out.println("跳出三界外,不在五行中");
break;
}
}
continue
使用情形:结束本次循环,继续下一次循环
public static void main(String[] args){
//continue
//求一下100以内的偶数和
int sum = 0;
for(int i =1;i <= 100 ; i++){//i = 1 2 3 4 5 6 7......
//使用场景 奇数跳过去,不参与累加和
if(i % 2 != 0){
continue;
}
sum += i;
}
}
扩展知识点
-
死循环
概念:循环中条件永远都是true,死循环是永不结束的循环。例如:while(true){}.
死循环一般要和跳出语句结合。
2.循环嵌套
概念:是指一个循环的循环体是另一个循环。比如说for循环中内置了一个for循环,就是循环嵌套
循环的次数 = 外部循环的次数 * 内部循环的次数
//格式:
for(1.初始化语句;2.判断语句;4.迭代语句){
//3.循环体内容
......
for(5.初始化语句2;6.判断语句2;8.迭代语句2){
//7.循环体内容2
}
}
执行流程
-
执行流程: 1—>2—->3—->5—>6—->7—>8—>7—>8—>…6不满足为止(跳出循环)—->4—–>2—>3—->5—->6—->7—->8—->6—->7—->8—>…6不满足为止(跳出循环)—->2不满足为止(结束整个循环),加载外层for循环后面的语句。
-
外循环一次,内循环多次
public static void main(String[] args){
//使用场景
//打印3*8长方形 长为3,宽为8
//使用循环嵌套技术来实现
//外循环3次,内循环8次
for(int i = 0 ; i< 3 ; i++){
for(int j = 0 j ;j < 8 ; j++){
//输出8 println()--->先打印内容再换行
System.out.print("*");
}
System.out.println();
}
}