2.流程控制

输入和输出

输出

如果输出后不想换行,可以用print()

格式化输出

格式化输出使用System.out.printf(),通过使用占位符%?printf()可以把后面的参数格式化成指定格式:

// 格式化输出
public class Main {
    public static void main(String[] args) {
        double d = 3.1415926;
        System.out.printf("%.2f\n", d); // 显示两位小数3.14
        System.out.printf("%.4f\n", d); // 显示4位小数3.1416
    }
}

Java的格式化功能提供了多种占位符,可以把各种数据类型“格式化”成指定的字符串:

占位符说明
%d格式化输出整数
%x格式化输出十六进制整数
%f格式化输出浮点数
%e格式化输出科学计数法表示的浮点数
%s格式化字符串

注意,由于%表示占位符,因此,连续两个%%表示一个%字符本身。

占位符本身还可以有更详细的格式化参数。下面的例子把一个整数格式化成十六进制,并用0补足8位:

// 格式化输出
public class Main {
    public static void main(String[] args) {
        int n = 12345000;
        System.out.printf("n=%d, hex=%08x", n, n); // 注意,两个%占位符必须传入两个数
    }
}

详细的格式化参数请参考JDK文档 java.util.Formatter

输入

我们先看一个从控制台读取一个字符串和一个整数的例子:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象
        System.out.print("Input your name: "); // 打印提示
        String name = scanner.nextLine(); // 读取一行输入并获取字符串
        System.out.print("Input your age: "); // 打印提示
        int age = scanner.nextInt(); // 读取一行输入并获取整数
        System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
    }
}
  1. 通过import语句导入java.util.Scanner
  2. 创建Scanner对象并传入System.in
  3. 要读取用户输入的字符串,使用scanner.nextLine(),要读取用户输入的整数,使用scanner.nextInt()

Scanner会自动转换数据类型,因此不必手动转换。

注意格式化输出一定要用**System.out.printf()**

if 条件判断

if () {

} else if () {

} else {

}

判断引用类型相等

在Java中,判断值类型的变量是否相等,可以使用==运算符。但是,判断引用类型的变量是否相等,==表示“引用是否相等”,或者说,是否指向同一个对象。例如,下面的两个String类型,它们的内容是相同的,但是,分别指向不同的对象,用==判断,结果为false

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1 == s2) {
            System.out.println("s1 == s2");
        } else {
            System.out.println("s1 != s2");
        }
    }
}

判断引用类型的变量内容是否相等,必须使用equals()方法

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        } else {
            System.out.println("s1 not equals s2");
        }
    }
}

注意:执行语句s1.equals(s2)时,如果变量s1null,会报NullPointerException,要避免NullPointerException错误,可以利用短路运算符&&

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1 != null && s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}

还可以把一定不是null的对象"hello"放到前面:例如:if ("hello".equals(s)) { ... }

switch多重选择

switch语句根据switch (表达式)计算的结果,跳转到匹配的case结果,然后继续执行后续语句,直到遇到break结束执行。

switch (option) {
        case 1:
			...
            break;
        case 2:
            ...
            break;
        case 3:
            ...
            break;
        ...
        default:
            ...
            break;
        }

如果有几个case语句执行的是同一组语句块,可以这么写:

switch (option) {
       case 1:
           ...
           break;
       case 2:
       case 3:
           ...
           break;
       default:
           ...
           break;
}

switch表达式

使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误。从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要break语句:

switch (fruit) {
       case "apple" -> System.out.println("Selected apple");
       case "pear" -> System.out.println("Selected pear");
       case "mango" -> {
           System.out.println("Selected mango");
           System.out.println("Good choice!");
       }
       default -> System.out.println("No fruit selected");
}

注意新语法使用->,如果有多条语句,需要用{}括起来。不要写break语句,因为新语法只会执行匹配的语句,没有穿透效应。

很多时候,我们还可能用switch语句给某个变量赋值。使用新的switch语法,不但不需要break,还可以直接返回值。把上面的代码改写如下:

String fruit = "apple";
       int opt = switch (fruit) {
           case "apple" -> 1;
           case "pear", "mango" -> 2;
           default -> 0;
       }; // 注意赋值语句要以;结束
       System.out.println("opt = " + opt);
}

这样可以获得更简洁的代码。

while循环

while循环的用法是:

while (条件表达式) {
    循环语句
}

while循环先判断循环条件是否满足,再执行循环语句;

while循环可能一次都不执行;

编写循环时要注意循环条件,并避免死循环。

do while循环

do while循环是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出。它的用法是:

do {
    执行循环语句
} while (条件表达式);

可见,do while循环会至少循环一次。

for循环

for循环的用法是:

for (初始条件; 循环检测条件; 循环后更新计数器) {
    // 执行语句
}

灵活使用for循环

for循环还可以缺少初始化语句、循环条件和每次循环更新语句,例如:

// 不设置结束条件:
for (int i=0; ; i++) {
    ...
}
// 不设置结束条件和更新语句:
for (int i=0; ;) {
    ...
}
// 什么都不设置:
for (;;) {
    ...
}

for each循环

Java还提供了另一种for each循环,它可以更简单地遍历数组:

int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
    System.out.println(n);
}

for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

除了数组外,for each循环能够遍历所有“可迭代”的数据类型,包括后面会介绍的ListMap等。

break和continue

无论是while循环还是for循环,有两个特别的语句可以使用,就是break语句和continue语句。

break

break语句通常都是配合if语句使用。要特别注意,break语句总是跳出自己所在的那一层循环。

for (int i=1; i<=10; i++) {
     System.out.println("i = " + i);
     for (int j=1; j<=10; j++) {
          System.out.println("j = " + j);
          if (j >= i) {
               break;
          }
     }
     // break跳到这里
     System.out.println("breaked");
}

continue

break会跳出当前循环,也就是整个循环都不会执行了。

continue则是提前结束本次循环,直接继续执行下次循环。

小总结

break语句通常配合if,在满足条件时提前结束整个循环;

continue语句通常配合if,在满足条件时提前结束本次循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值