Java输入,打印和流程控制语句
控制台输入
1 | // 1.导包 |
条件语句
- 表达式的结果是一个布尔值。
- 如果是true,直接进入if的方法体中。
- 如果结果为false,则跳过if的方法体,继续执行。
单分支if
格式 :
1
2
3if(表达式){
//方法体
}注意:方法体的默认语句只有一条的时候,可以省略
{ }
双分支if - else
需要对条件成立和不成立的情况分别处理
格式 :
1
2
3
4
5if(表达式){
// 方法体
} else {
// 方法体
}注意:方法体的默认语句只有一条的时候,可以省略
{ }
多重if选择结构
格式 :
1
2
3
4
5
6
7
8if(表达式){
方法体
} else if(表达式){
方法体
} ...
else{
方法体
}注意:
- else{}可以省略,表示条件都不成立的情况
- 当条件成立的时候,后面else if 代码不执行
示例
判断字符串类型的值是否相等
equals(String str)
:区分大小写1
2
3if("张三".equals(str)){
System.out.print("姓名是:"+"张三");
}==
判断内存地址, equals默认使用==
,上面能够判断值是因为 String类重写了equals方法。
分支语句
switch
匹配就是全等。
语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14switch(表达式){
case 值1:
// 表达式的值和 值1匹配上了,需要执行的代码;
break;
case 值2:
// 表达式的值和 值2匹配上了,需要执行的代码;
break;
case 值3:
// 表达式的值和 值3匹配上了,需要执行的代码;
break;
default:
// 如果表达式的值和以上的case后面的值都没有匹配上,那么就执行这里的代码。
break;
}
- 注意:
- switch语句将表达式的值依次与每个case子语句中的常量值相比较。如果匹配成功,则执行该case语句中的语句,直到遇到break语句为止。
- default语句是可选的,当表达式的值与任何一个case语句都不匹配时,就执行default后的语句。
- 不写break会穿透到下一个break。default的位置可以任意,没有break,照样可以穿透向下执行。
- swtich()变量类型只能是int、short、char、byte和enum类型,String(jdk1.7),而不能使用浮点类型或long类型。
- 只能进行等值的判断
嵌套if选择结构
格式:
1
2
3
4
5
6
7
8
9if(条件) {
if(条件) {
代码块一;
}else {
代码块二;
}
}else {
代码块三;
}
多重if 和switch 的区别
- switch只能等值判断
- 对于等值问题的判断,switch效率高
- 编译器编译switch与编译if…else…不同。
- 不管有多少case,都直接跳转,不需逐个比较查询;switch只计算一次值.
- 根本区别在于,switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
- if能够进行范围的判断,if-else只是单纯地一个接一个比较;if…else每个条件都计算一遍;
switch如何实现
- JDK1.0-1.4 数据类型接受 byte、short、int、char
- JDK1.5 数据类型接受 byte、short、int、char、enum(枚举)、(包装类型Character、Byte、Short、Integer)
- JDK1.7 数据类型接受 byte、short、int、char、enum(枚举)、包装类型、String 六种类型
- float、double都不能用于switch语句。
- jdk12开始switch语法支持函数式接口和lambda表达式
- jdk14新特性,增加了yield用法
- 但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,switch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?
- 有一点Java开发经验的人这个时候都会猜测switch对String的支持是使用equals()方法和hashcode()方法。
对整型支持
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class switchDemoInt {
public static void main(String[] args) {
int a = 5;
switch (a) {
case 1:
System.out.println(1);
break;
case 5:
System.out.println(5);
break;
default:
break;
}
}
}反编译后的代码如下:
- 发现,反编译后的代码和之前的代码比较除了多了两行注释以外没有任何区别,那么我们就知道,switch对int的判断是直接比较整数的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class switchDemoInt{
public switchDemoInt(){
}
public static void main(String args[]){
int a = 5;
switch(a){
case 1: // '\001'
System.out.println(1);
break;
case 5: // '\005'
System.out.println(5);
break;
}
}
}
switch对字符型支持
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class switchDemoInt {
public static void main(String[] args) {
char a = 'b';
switch (a) {
case 'a':
System.out.println('a');
break;
case 'b':
System.out.println('b');
break;
default:
break;
}
}
}编译后的代码如下:
- 通过以上的代码作比较我们发现:对char类型进行比较的时候,实际上比较的是ascii码,编译器会把char型变量转换成对应的int型变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class switchDemoChar{
public switchDemoChar(){
}
public static void main(String args[]){
char a = 'b'; // 98
switch(a){
case 97: // 'a'
System.out.println('a');
break;
case 98: // 'b'
System.out.println('b');
break;
}
}
}
switch对字符串支持
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class switchDemoString {
public static void main(String[] args) {
String str = "world";
switch (str) {
case "hello":
System.out.println("hello");
break;
case "world":
System.out.println("world");
break;
default:
break;
}
}
}反编译结果
到这个代码,你知道原来字符串的switch是通过
equals()
和hashCode()
方法来实现的。- 记住,switch中只能使用整型,比如
byte
。short
,char
(ackii码是整型)以及int
。还好hashCode()
方法返回的是int
,而不是long
。通过这个很容易记住hashCode
返回的是int
这个事实。 - 仔细看下可以发现,进行
switch
的实际是哈希值,然后通过使用equals方法比较进行安全检查,这个检查是必要的,因为哈希可能会发生碰撞。 - 因此它的性能是不如使用枚举进行switch或者使用纯整数常量,但这也不是很差。
- 因为Java编译器只增加了一个
equals
方法,如果你比较的是字符串字面量的话会非常快,比如”abc” ==”abc”。如果你把hashCode()
方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个switch
语句是用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()
方法的调用开销其实不会很大。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class switchDemoString{
public switchDemoString(){
}
public static void main(String args[]){
String str = "world";
String s;
switch((s = str).hashCode()){
default:
break;
case 99162322:
if(s.equals("hello"))
System.out.println("hello");
break;
case 113318802:
if(s.equals("world"))
System.out.println("world");
break;
}
}
}- 记住,switch中只能使用整型,比如
switch- 函数式接口和lambda表达式
使用switch标准方式编写代码太多的break造成代码冗余可读性不高 可以借助函数式接口和lambda表达式简化书写
1 | switch (表达式) { |
使用 - > 方法更加简单, ->的用法其实只是相当于不用输入break就可以跳出判断
, 保证其只有一条分支可走.
1 | int dayOfWeek = 2; |
jdk12之后还可以多条件合并
1 | int dayOfWeek = 2; |
switch yield 用法
在 Java 12 及其之后的版本中,switch
语句引入了 yield 关键字,以支持在 switch
表达式中返回值。yield
允许每个 case
语句返回一个结果,与传统 switch
语句返回 void
不同。因此,现在可以将 switch
语句用作表达式,返回一个值。
- 表达式赋值:
switch
表达式赋值给变量,yield
返回的值被用作表达式的结果。 - 用在复杂逻辑:使用
yield
可以在case
块中处理更复杂的逻辑,允许多行代码。 - **替换传统
switch
**:可以利用switch
表达式替代传统switch
语句,以便编写更清晰和简洁的代码。
1 | public class Main { |
switch使用总结
- 关于switch对整型、字符型、和字符串型的支持的实现方式,总结一下我们可以发现,其实swich只支持一种数据类型,那就是整型,其他数据类型都是转换成整型之后在使用switch的。
循环语句
- 解决重复的问题
while语句
格式
1
2
3
4
5初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}示例
1
2
3
4
5
6
7// 1.初始值
int i=0;
// 2.终止值
while(i<100){
// 3. 迭代次数
System.out.println("第"+ (++i) +"遍好好学习");
}
do - while
先执行,后条件判断
1
2
3do {
//循环体语句;
}while((判断条件语句);
while 和 do - while的区别
- while:
- 先判断,后执行
- 首次判断为假,一次都不执行
- do - while:
- 先执行,后判断
- 首次判断为为假,也执行一遍
for循环
格式:
1
2
3
4
5
6
7for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
第一步:先执行初始化语句,只执行一次
第二步:执行判断条件语句
第三部:执行循环体语句
第四步:执行控制条件语句,然后再执行循环体语句【循环】表达式二去掉, 表示死循环。
- 注意:分号不可以去掉
跳转语句
break
作用:结束循环
场合: 循环,switch
1
2
3
4
5
6
7
8
9
10
11
12
13// 九九乘法表
public static void main(String[] args) {
for(int i=1,j =1;i<=9;i++){//j行 i列
System.out.print(i+"*"+j+"="+(i*j)+"\t");
if(i==j){
if(j==9)
break;
j++;
i=0;
System.out.println();
}
}
}
continue
作用: 结束本次循环,后面的不执行,进入下一次循环
用在循环
1
2
3
4
5
6//输出1-10之间的偶数
for(int i =0; i<= 10; i++){
if(i%2 != 0)
continue;
System.out.print(i+" ");
}
break结束外层循环
- 可以在循环的前面加个**
标签:
**
1 | public static void main(String[] args) { |
小数的格式化
- java.lang 基础类库
- java.util 工具类,集合接口
- java.math 数学类
- java.text 处理文本、日期、数字和消息的类和接口(格式化)
printf语句
1 | //显示小数%f,整数%d,字符%c,布尔%b, |
DecimalFormat 类
- 规则:
- 使用0,不足用0补;
- #代表位数
1 | DecimalFormat df=new DecimalFormat("0000.00"); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凉月の博客!
评论