day05
补:位运算符的面试题(位运算符见day04)
面试题1:使用最有效率的方式计算出4*8
//考点:位运算
//System.out.println(4<<3);
//面试题2:描述出下列代码的运行过程
//向上转型:使用符号位补位,补到最高位
//向下转型:从最高位开始舍弃
//考点:char类型取值范围没有负数,向上转型是使用0补位
//-1 -- int:1111,1111,1111,1111,1111,1111,1111,1111
// (byte):1111,1111
// (char):1111,1111,1111,1111
// (int):0000,0000,0000,0000,1111,1111,1111,1111
System.out.println((int)(char)(byte)-1);//65535
1.转义字符
含义:具有特殊意义的字符本身
分类:
\" 表示一个双引号字符 \' 表示一个单引号字符 \\ 表示一个斜杠字符 \n 表示换行 \t 表示水平制表
//案例:
System.out.println("\"好好学习\"");
System.out.println("\'好好学习\'");
System.out.println("\\好好学习\\");
println(); 表示输出 + 换行
print(); 表示输出
System.out.print("好好学习吧\n");
System.out.print("做真实的自己");
System.out.println("3*3=9\t3*4=12\t3*5=15\t3*6=18");
System.out.println("4*3=12\t4*4=16\t4*5=29\t4*6=24");
2.常量
概念:在程序执行过程中不可发生改变的量
分类:
1.数字字面量:程序中出现的数字
整数数字默认int类型
小数数字默认double类型
2.字面值常量:双引号括起来的内容 ps:"好好学习"
3.final(最终的)修饰变量
//案例:
final int NUM = 100;
System.out.println(NUM);//100
注:
字符常量:必须使用单引号,有且仅能一个字符 ‘A’,‘0’
字符串常量:必须使用双引号,内容可有可无 “HelloWorld”
只要用双引号引起来的,不管里面的内容是什么,不管里面有没有内容,都是字符串类型的字面量。
字符类型的字面量必须用单引号引起来,不管内容是什么,但是个数有且只能有一个。
3.命名规范
大驼峰命名法/帕斯卡命名法:
作用:类名、接口名
规则:单词首字母大写
ps:
public class HelloWorld{}
小驼峰命名法:
作用:方法名、变量名
规则:除了第一个单词,其余单词首字母大写
ps:
String stuName = “小明”;
常量命名法:
作用:常量
规则:所有字母大写,单词与单词之间使用下划线隔开
ps:
final int MAX_VALUE = 100;
4.Java的执行语句
分类:
1.顺序语句:方法里的代码从上往下顺序执行
2.分支语句:判断某个条件,如果成立就执行对应的功能
2.1 if分支
2.2 switch分支
3.循环语句:某个条件成立,就重复性的执行某个功能
3.1 for循环
3.2 while循环
3.3 do-while循环
4.特殊的流程控制语句
4.1 break
4.2 continue
4.3 return
4.4 label
4.1 简单的if分支
语法结构:
if(表达式){
…代码块…
}
理解:表达式必须是boolean值
true - 执行代码块false - 跳过if分支,执行分支以外的代
//案例:如果小明的Java考试成绩大于98分,小明就能获得一辆法拉利作为奖励
Scanner scan = new Scanner(System.in);
System.out.println("请输入Java考试成绩:");
double score = scan.nextDouble();
if(score > 98){
System.out.println("奖励小明法拉利玩具赛车一辆");
}
注:
1.如果大括号省略了,那么if只能控制距离他最近的那一条语句。
2.if可以判断区间,判断复杂的条件,只要结果是boolean值就可以了
4.2 简单的if…else…分支
if(表达式){
…代码块…
}else{
…else代码块…
}
if…else…在二选一的情况下使用
4.3 复杂的if分支
if(表达式1){
…代码块1…
}else if(表达式2){
…代码块2…
}else if(表达式n){
…代码块n…
}else{
…else代码块…
}
从上往下判断表达式,哪个表达式先为true,就执行对应的代码块
表达式的结果必须是boolean
true - 执行对应的代码块
false - 往下判断剩余的表达式
如何表达式都不为true,就执行else代码块
注意:else{}根据需求可写可不写
4.4 嵌套if分支
案例:学校举行运动会,百米赛跑跑入16秒内的学生有资格进决赛,根据性别分别进入男子组和女子组。
Scanner scan = new Scanner(System.in);
System.out.println("请输入比赛成绩:");
double score = scan.nextDouble();
if(score>=0 && score<16){
System.out.println("请输入性别:");
String sex = scan.next();
if(sex.equals("男")){//比较两个字符串内容是否相同(sex和"男")
System.out.println("恭喜进入到男子组决赛");
}else if(sex.equals("女")){//比较两个字符串内容是否相同(sex和"女")
System.out.println("恭喜进入到女子组决赛");
}else{
System.out.println("性别异常");
}
}else if(score >= 16){
System.out.println("重在参与");
}else{
System.out.println("成绩异常");
}
小结:if可以无限嵌套
经验:if最好不要嵌套3层以上,因为可读性会降低
5.switch分支的使用
语法结构:
switch(表达式){
case 值1:
…代码块1…
break;
case 值2:
…代码块2…
break;
case 值n:
…代码块n…
break;
default:
…default代码块…
break;
}
理解:
表达式的结果分别于值1,值2,值n比较
哪个相同就执行对应的代码块
如果都不相同就执行default代码块
break表示跳出整个分支语句
案例:小美参加计算机编程大赛
如果获得第一名,将参加个月马尔代夫旅游
如果获得第二名,将奖励苹果Pro笔记本电脑一部
如果获得第三名,将奖励移动硬盘一个
否则,晚上通宵学习
Scanner scan = new Scanner(System.in);
System.out.println("请输入比赛名次:");
String str = scan.next();
switch(str){
case "第一名":
System.out.println("参加1个月马尔代夫旅游");
break;
case "第二名":
System.out.println("奖励苹果Pro笔记本电脑一部");
break;
case "第三名":
System.out.println("奖励移动硬盘一个");
break;
default:
System.out.println("晚上通宵学习");
break;
}
5.1 switch分支的深入
面试题:
1.case的值可以相同吗?
不能相同
2.default可以省略吗?
可以
3.break可以省略吗?
可以,但是不写break会引发case穿透现象
4.default的位置一定要在最后吗?
不一定。最后放在后面,因为考虑代码的可读性。
5.表达式值的类型可以是什么?
byte、short、int、char、枚举(JDK1.5)、String(JDK1.7)
6.switch底层判断的逻辑是什么?
switch底层判断的逻辑是什么?
switch底层判断的都是int类型,因为switch底层有个字节码命令,必须接受int类型的值
byte --> int 自动转型
short --> int 自动转型
int --> int 直接使用
char --> int 获取的是字符的Unicode码
枚举 --> int 获取枚举对象的编号
String --> int 获取的字符串的hash码(hash码:字符的Unicode+散列算法得到的一个数字)
7.判断下面的输出结果?
switch(1000){
case 10:
System.out.println("10");
break;
default:
System.out.println("default代码块");
case 50:
System.out.println("50");
case 80:
System.out.println("80");
break;
case 100:
System.out.println("100");
break;
}
default代码块 50 80
注:if vs switch
同:都是选择分支语句。
异:
1.表达式的区别:
if表达式值的类型是boolean。
switch分支表达式值的类型是byte,char,int,枚举,String。
2.应用场景的区别:
if:判断区间和复杂添加
switch:判断单个值是否相同
/**
需求:输入年和月,输出当月的天数
分析:
1/3/5/7/8/10/12月 -- 31天
4/6/9/11月 -- 30天
2月 -- 闰年29天、平年28天
注意:年份被4整除且不能被100整除 或者 年份被400整数都为润年
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scan.nextInt();
System.out.println("请输入月份:");
int month = scan.nextInt();
int day = 0;
switch(month){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
day = 31;
break;
case 4:case 6:case 9:case 11:
day = 30;
break;
case 2:
if(year%4==0 && year%100!=0 || year%400==0){//闰年
day = 29;
}else{//平年
day = 28;
}
break;
}
if(month>=1 && month<=12){
System.out.println(year + "年" + month + "月的天数为:" + day + "天");
}else{
System.out.println("数据错误");
}
6.Java的循环
分类:
1.for循环(重点)
2.while循环
3.do-while循环
好处:减少了代码的冗余(减少重复性的代码)
6.1 for循环
语法结构:
for (初始化;条件判断;更新变量) {
循环体语句;
}
执行顺序:
1.初始化变量
2.判断条件 – 结果必须是boolean类型
true – 执行代码块,更新变量,重复第2个步骤
false – 跳出整个循环语句
//需求1:循环输出1~10的数字
for(int i = 1;i<=10;i++){
System.out.println(i);
}
//需求2:循环输出1~10的奇数数字
for(int i = 1;i<=10;i+=2){
System.out.println(i);
}
//需求3:循环输出10~1的数字
for(int i = 10;i>=1;i--){
System.out.println(i);
}
//需求4:循环输出10~1的偶数数字
for(int i = 10;i>=1;i-=2){
System.out.println(i);
}
for循环变形记:
int i = 1;
for(;i<=5;){
System.out.println("用良心做教育 -- " + i);
//i++;
++i;
}
System.out.println(i);
死循环:该循环永远不可能跳出
for(;;){
System.out.println("死循环");
}
伪死循环:该循环一直++,循环了21亿多次,再++就超出了int类型的最大取值范围,i就变为负数了,这时就跳出了该循环
for(int i = 0;i>=0;i++){
System.out.println("伪死循环");
}
小结:
1.初始化变量不一定每次都是从0开始,也可以从1,也可以从10开始
2.更新变量不一定每次都是++,也可以+=2,也可以–,也可以-=2
3.在for循环内声明的变量只能在循环中使用
4.for循环中的更新变量i++和++i没有区别
案例:循环录入5次int类型的数字,输出最大值
Scanner scan = new Scanner(System.in);
//假设第一个数字为最大值
System.out.println("请输入第1个数字:");
int max = scan.nextInt();
for(int i = 2;i<=5;i++){
System.out.println("请输入第" + i + "个数字:");
int num = scan.nextInt();
//录入的数字比max更大,就将录入的数字赋值给max
if(max < num){
max = num;
}
}
System.out.println("最大值为:" + max);
6.2 for循环嵌套
//需求1:打印以下图形
****
****
****
for(int i = 0;i<3;i++){//控制行数
for(int j = 0;j<4;j++){//控制列数
System.out.print("*");
}
System.out.println();//换行
}
两重循环,外循环控制行数,内循环控制列数
//九九乘法表
for(int i=1;i<=9;i++){ //外循环控制行数
for(int j=1;j<=i;i++){ //内循环控制列数
System.out.print(j+"x"+i+"="+(j*I)+"\t");
}
}
总结
1.转义字符:具有特殊意义的字符本身
2.常量:程序在执行过程中不可发生改变的量
2.1 数字字面量
2.2 字面值常量
2.3 final修饰的变量
扩展:驼峰命名法
3.分支语句
3.1 if分支
3.2 switch分支(注重底层)
3.3 if vs switch(表达式的区别、应用场景的区别)
4.for循环
4.1 使用
4.2 for循环嵌套