03.01运算符
03.01.1逻辑运算符
逻辑运算符有哪些
& ( 并且) , | ( 或者) , ! ( 非) , ^ ( 异或) , && ( 短路与) , || ( 短路或)
注意事项:
逻辑运算符一般用于连接boolean 类型的表达式或者值。
在Java中我们要表示一个数大于3 并且小于6 ,不可以写成3 < x< 6 ,应该写成 x> 3 & x< 6 。
表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。
算术表达式:a + b
关系表达式:a == b
结论:
& 逻辑与: 有false 则false 。
| 逻辑或: 有true 则true 。
^ 逻辑异或: 相同为false ,不同为true 。
! 逻辑非: 非false 则true ,非true 则false 。
运算符&与&&的区别
两者最终结果一样。
&& 具有短路效果。左边是false ,右边不执行。
为提高效率,多使用&& 。
| 与|| 同理
03.01.2 位运算符
位运算符有哪些:
&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意事项:位运算是直接对二进制补码进行运算。运算效率高一些
&:有0则0
|:有1则1
^:相同则0,不同则1
~:按位取反 0变1 1变0 符号位也包含在内取反
例:
正数的按位反:+9
原码:00001001
反码:00001001
补码:00001001
按位取反 1 1110110 补码
再推回原码
1 1110110 补码
- 1
-----------------------------
1 1110101 反码
取反
----------------------
1 0001010 原码
最后结果是: -10
位异或运算符的特点及面试题
位异或运算符的特点
^ 的特点:一个数据被另一个数据位异或两次,该数本身不变。
自己位异或自己是0
面试题:
请自己实现两个整数变量的交换。
public class MyDemo1 {
public static void main ( String[ ] args) {
int a = 10 ;
int b = 20 ;
int t = a;
a = b;
b = t;
System. out. println ( "a:" + a) ;
System. out. println ( "b:" + b) ;
}
}
位运算符<< >> >>>的用法
<<:左移 空位补0,被移除的高位丢弃。
>>:右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
>>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
(对所操作数的二进制补码进行移动)
结论:
<< : 把<<左边的数据乘以2的移动次幂
>> : 把>>左边的数据除以2的移动次幂
03.01.3三元运算符
三元(三目)运算符的格式
(关系表达式) ? 表达式1 : 表达式2;
三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1;
如果为false,运算后的结果是表达式2;
案例:获取两个数中的最大值 求三个数中的最大值
public class MyDemo2 {
public static void main(String[] args) {
//求两个数的最大值
int a=5000000;
int b=100;
int max=a>b?a:b;
System.out.println("最大值是:"+max);
System.out.println("====================================");
//求三个数的最大值:
int j=200;
int i=500;
int h=30;
int max1=j>i?j:i;
int max2=max1>h?max1:h;
System.out.println("最大值是:" + max2);
}
}
03.02 键盘录入的格式
导包
格式:
import java.util.Scanner;
位置:
在class上面。
创建键盘录入对象
格式:
Scanner sc = new Scanner(System.in); sc可以自己起名字
通过对象获取数据
格式:
int x = sc.nextInt();
03.03 if语句
03.03.1 if语句格式1及其使用
if 语句的格式1
if ( 比较表达式或者是boolean 类型的值) {
语句体;
}
执行流程:
先计算比较表达式的值,看其返回值是true 还是false 。
如果是true ,就执行语句体;
如果是false ,就不执行语句体;
案例演示
判断两个数据是否相等
public class MyDemo2 {
public static void main ( String[ ] args) {
int a= 20 ;
int b= 100 ;
if ( a== b|| a< b) {
System. out. println ( "要执行的语句333333" ) ;
}
System. out. println ( "下面的代码" ) ;
}
}
03.03.2 if语句的格式2及其使用
if 语句的格式2
if ( 比较表达式) {
语句体1 ;
} else {
语句体2 ;
}
注意事项:else 后面是没有比较表达式的,只有if 后面有。
执行流程:
首先计算比较表达式的值,看其返回值是true 还是false 。
如果是true ,就执行语句体1 ;
如果是false ,就执行语句体2 ;
案例:判断一个数是奇数还是偶数,并输出。
class Demo {
public static void main ( String[ ] args) {
int a= 3 ;
if ( a% 2 == 0 ) {
System. out. println ( "a是偶数" ) ;
} else {
System. out. println ( "a是奇数" ) ;
}
}
}
03.03.3 if语句的格式3及其使用
if 语句的格式3 :
if ( 比较表达式1 ) {
语句体1 ;
} else if ( 比较表达式2 ) {
语句体2 ;
} else if ( 比较表达式3 ) {
语句体3 ;
}
. . .
else {
语句体n+ 1 ;
}
执行流程:
首先计算比较表达式1 看其返回值是true 还是false ,
如果是true ,就执行语句体1 ,if 语句结束。
如果是false ,接着计算比较表达式2 看其返回值是true 还是false ,
如果是true ,就执行语句体2 ,if 语句结束。
如果是false ,接着计算比较表达式3 看其返回值是true 还是false ,
. . .
如果都是false ,就执行语句体n+ 1 。
注意事项: 当只要有一个条件满足时,if 语句结束。else 是可以省略,但是不建议省略。
案例演示
需求:键盘录入一个成绩,判断并输出成绩的等级。
import java. util. Scanner;
public class MyDemo6 {
public static void main ( String[ ] args) {
Scanner scanner = new Scanner ( System. in) ;
System. out. println ( "请输入你的成绩 0---100" ) ;
int score = scanner. nextInt ( ) ;
if ( score>= 0 && score< 60 ) {
System. out. println ( "成绩不及格" ) ;
} else if ( score >= 60 && score < 80 ) {
System. out. println ( "成绩差" ) ;
} else if ( score >= 80 && score < 90 ) {
System. out. println ( "成绩中等" ) ;
} else if ( score >= 90 && score < 100 ) {
System. out. println ( "优秀" ) ;
} else if ( score== 100 ) {
System. out. println ( "很棒 满分" ) ;
} else {
System. out. println ( "你乱输入 ,成绩不合法" ) ;
}
}
}
03.03.4 if语句的嵌套使用
案例演示
需求:获取三个数据中的最大值
if 语句的嵌套使用。
可以三元实现,也可以if 嵌套实现。
public class MyDemo4 {
public static void main ( String[ ] args) {
int max= 0 ;
if ( num1> num2) {
if ( num1> num3) {
max= num1;
} else {
max= num3;
}
} else {
if ( num2> num3) {
max= num2;
} else {
max= num3;
}
}
System. out. println ( "最大值是:" + max) ;
}
}
03.03.5 if语句使用的注意事项
比较表达式无论简单还是复杂,结果必须是boolean 类型
if 语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。
一般来说:有左大括号就没有分号,有分号就没有左大括号
else 后是没有表达式的,只有if 后面有。
03.03.6 if语句和三元运算符的转换问题
三元运算符实现的,都可以采用if 语句实现。反之不成立。
什么时候if 语句实现不能用三元改进呢?
当if 语句控制的操作是一个输出语句的时候就不能。
为什么呢? 因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。
案例:获取两个数中较大的值。
public class MyDemo7 {
public static void main ( String[ ] args) {
int max= 100 > 50 ? 100 : 50 ;
System. out. println ( max) ;
int max2= 0 ;
if ( 100 > 50 ) {
max2= 100 ;
} else {
max2= 50 ;
}
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
if ( 100 > 50 ) {
System. out. println ( "真的情况进来执行了" ) ;
} else {
System. out. println ( "假的情况进来执行了" ) ;
}
}
}
03.04 switch语句
03.04.1 switch语句的格式和基本使用
switch 语句的格式
switch ( 表达式) {
case 值1 :
语句体1 ;
break ;
case 值2 :
语句体2 ;
break ;
case 值3 :
语句体3 ;
break ;
. . . .
default :
语句体n+ 1 ;
break ;
}
switch 语句的格式解释
( 1 ) : switch 表示这是switch 语句
表达式的取值:byte , short , int , char
JDK5以后可以是枚举( 什么是枚举,以后再讲)
JDK7以后可以是String
( 2 ) : case 后面跟的是要和表达式进行比较的值
( 3 ) : 语句体部分可以是一条或多条语句
( 4 ) : break 表示中断,结束的意思,可以结束switch 语句
( 5 ) : default 语句表示所有情况都不匹配的时候,就执行该处的内容,和if 语句的else 相似
面试题
byte 可以作为switch 的表达式吗? 可以
long 可以作为switch 的表达式吗? no
String可以作为switch 的表达式吗? JDK1. 7
执行流程
先计算表达式的值
然后和case 后面的匹配,如果匹配成功就执行对应的语句,遇到break 就会结束, 否则执行default 控制的语句
案例:
public class MyDemo {
public static void main ( String[ ] args) {
Scanner sc = new Scanner ( System. in) ;
System. out. println ( "请输入月份 1----12" ) ;
int month = sc. nextInt ( ) ;
switch ( month) {
case 3 :
case 4 :
case 5 :
System. out. println ( "春季" ) ;
break ;
case 6 :
case 7 :
case 8 :
System. out. println ( "夏季" ) ;
break ;
case 9 :
case 10 :
case 11 :
System. out. println ( "秋季" ) ;
break ;
default :
System. out. println ( "冬季" ) ;
break ;
}
}
}
03.04.2 switch语句的注意事项
case 后面只能是常量,不能是变量,而且,多个case 后面的值不能出现相同的值
default 可以省略吗?
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
break 可以省略吗?
可以省略,但是结果可能不是我们想要的。
会出现一个现象:case 穿透。
最终我们建议不要省略
default 一定要在最后吗?
不是,可以在任意位置。但是建议在最后。
switch 语句的结束条件
a: 遇到break 就结束了
b: 执行到末尾就结束了
03.05 switch语句和if语句的使用场景
在做判断的时候,我们有两种选择,if语句和switch语句,那么,我们到底该如何选择使用那种语句呢?
if语句使用场景:
针对结果是boolean类型的判断
针对一个范围的判断
针对几个常量值的判断
switch语句使用场景:
针对几个常量值的判断
03.05 for语句
for语句的格式:
for(初始化表达式语句;判断条件语句;控制条件语句) {
循环体语句;
}
执行流程:
a:执行初始化表达式语句
b:执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
c:执行循环体语句;
d:执行控制条件语句
e:回到B继续。
注意事项:
初始化表达式语句只执行一次
案例:在控制台输出10次"helloworld";
public class MyDemo2 {
public static void main(String[] args) {
//对于重复代码,我们要考虑使用循环来做
//for 循环
//输出10句我爱你
/*
* 1.int i=0; 循环的初始值 只执行一次
* 2.i<10 循环的条件:当i<10 为true时 循环继续执行循环体里面的代码 i<10 为false时循环终止
* 3. 循环体{ System.out.println("我爱你");}
* 4. i++ 控制循环的语句。
* 然后返回 2 继续判断 如果为true继续第3步 然后第4步,直到 i<10 为false时 循环结束
*
* */
//1 2 //4
for(int i=0;i<10;i++){
//3
System.out.println("我爱你");
}
}
}
注意事项
a:判断条件语句无论简单还是复杂结果是boolean类型。
b:循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
c:一般来说:有左大括号就没有分号,有分号就没有左大括号
idea快速生成循环语句 fori 回车
反向遍历快速生成 forr 回车
03.05.1 for语句练习(水仙花数)
public class MyDemo {
public static void main ( String[ ] args) {
int count= 0 ;
for ( int i = 100 ; i <= 999 ; i++ ) {
int ge= i/ 1 % 10 ;
int shi= i/ 10 % 10 ;
int bai= i / 100 % 10 ;
int flowerNumber= ge* ge* ge+ shi* shi* shi+ bai* bai* bai;
if ( i== flowerNumber) {
System. out. println ( "水仙花数是:" + i) ;
count++ ;
}
}
System. out. println ( "水仙花数总共有:" + count+ " 个" ) ;
}
}
03.06 while语句
循环结构while 语句的格式:
while 循环的基本格式:
while ( 判断条件语句) {
循环体语句;
}
完整格式:
初始化条件语句;
while ( 判断条件语句) {
循环体语句;
控制条件语句;
}
执行流程:
a: 执行初始化条件语句;
b: 执行判断条件语句, 看其返回值是true 还是false
如果是true ,就继续执行
如果是false ,就结束循环
c: 执行循环体语句;
d: 执行控制条件语句
e: 回到b继续。
案例:输出10 句我爱你
public class MyTest {
public static void main ( String[ ] args) {
int i= 1 ;
while ( i<= 10 ) {
System. out. println ( "我爱你们" ) ;
i++ ;
}
}
}
03.07 do while 语句
循环结构do . . . while 语句的格式:
do {
循环体语句;
} while ( 判断条件语句) ;
完整格式;
初始化条件语句;
do {
循环体语句;
控制条件语句;
} while ( 判断条件语句) ;
执行流程:
a: 执行初始化条件语句;
b: 执行循环体语句;
c: 执行控制条件语句;
d: 执行判断条件语句, 看其返回值是true 还是false
如果是true ,就继续执行
如果是false ,就结束循环
e: 回到b继续。
案例:
public class MyTest4 {
public static void main ( String[ ] args) {
int i= 10 ;
do {
System. out. println ( "循环体执行了" ) ;
} while ( false ) ;
System. out. println ( "===========================" ) ;
do {
System. out. println ( "循环体执行了" ) ;
i-- ;
} while ( i> 0 ) ;
}
}
03.08 三种循环语句的区别
三种循环语句的区别:
( 1 ) : do . . . while 循环至少执行一次循环体。
而for , while 循环必须先判断条件是否成立,然后决定是否执行循环体语句。
( 2 ) : A: 如果你想在循环结束后,继续使用控制条件的那个变量,用while 循环,否则用for 循环。不知道用for 循环。
因为变量及早的从内存中消失,可以提高内存的使用效率。
B: 建议优先考虑for 循环,然后是while 循环 ,最后是do . . . while 循环
03.09 死循环
一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环。
两种最简单的死循环格式
while(true){...}
for(;;){...}
03.08 三种循环语句的区别
三种循环语句的区别:
( 1 ) : do . . . while 循环至少执行一次循环体。
而for , while 循环必须先判断条件是否成立,然后决定是否执行循环体语句。
( 2 ) : A: 如果你想在循环结束后,继续使用控制条件的那个变量,用while 循环,否则用for 循环。不知道用for 循环。
因为变量及早的从内存中消失,可以提高内存的使用效率。
B: 建议优先考虑for 循环,然后是while 循环 ,最后是do . . . while 循环
03.09 死循环
一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环。
两种最简单的死循环格式
while(true){...}
for(;;){...}