控制台输入

1
2
3
4
5
6
7
8
9
// 1.导包
import java.util.Scanner;
// 2.创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
// 3.对象调用方法
String str =sc.next();
int num1 = sc.nextInt();
double num2 = sc.nextDouble();

条件语句

  • 表达式的结果是一个布尔值。
    • 如果是true,直接进入if的方法体中。
    • 如果结果为false,则跳过if的方法体,继续执行。

单分支if

  • 格式 :

    1
    2
    3
    if(表达式){
    //方法体
    }
  • 注意:方法体的默认语句只有一条的时候,可以省略{ }

双分支if - else

  • 需要对条件成立和不成立的情况分别处理

  • 格式 :

    1
    2
    3
    4
    5
    if(表达式){
    // 方法体
    } else {
    // 方法体
    }

    注意:方法体的默认语句只有一条的时候,可以省略{ }

多重if选择结构

  • 格式 :

    1
    2
    3
    4
    5
    6
    7
    8
    if(表达式){
    方法体
    } else if(表达式){
    方法体
    } ...
    else{
    方法体
    }
  • 注意:

    • else{}可以省略,表示条件都不成立的情况
    • 当条件成立的时候,后面else if 代码不执行

示例

  • 判断字符串类型的值是否相等

    • equals(String str) :区分大小写

      1
      2
      3
      if"张三".equals(str)){
      System.out.print("姓名是:"+"张三");
      }
    • ==判断内存地址, equals默认使用==,上面能够判断值是因为 String类重写了equals方法。

分支语句

switch

  • 匹配就是全等。

  • 语法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    switch(表达式){
    case1:
    // 表达式的值和 值1匹配上了,需要执行的代码;
    break;
    case2:
    // 表达式的值和 值2匹配上了,需要执行的代码;
    break;
    case3:
    // 表达式的值和 值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
    9
    if(条件) {
    if(条件) {
    代码块一;
    }else {
    代码块二;
    }
    }else {
    代码块三;
    }

多重if 和switch 的区别

  1. switch只能等值判断
  2. 对于等值问题的判断,switch效率高
    • 编译器编译switch与编译if…else…不同。
    • 不管有多少case,都直接跳转,不需逐个比较查询;switch只计算一次值.
    • 根本区别在于,switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
  3. if能够进行范围的判断,if-else只是单纯地一个接一个比较;if…else每个条件都计算一遍;

switch如何实现

  • Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte short int char String
  • 但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,switch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?
    • 有一点Java开发经验的人这个时候都会猜测switch对String的支持是使用equals()方法和hashcode()方法。

对整型支持

  • 示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public 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
    15
    public 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
    15
    public 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
    15
    public 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
    15
    class 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中只能使用整型,比如byteshortchar(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
    20
    public 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对整型、字符型、和字符串型的支持的实现方式,总结一下我们可以发现,其实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
    3
    do {
    //循环体语句;
    }while((判断条件语句);

while 和 do - while的区别

  • while:
    • 先判断,后执行
    • 首次判断为假,一次都不执行
  • do - while:
    • 先执行,后判断
    • 首次判断为为假,也执行一遍

for循环

  • 格式:

    1
    2
    3
    4
    5
    6
    7
    for(初始化语句;判断条件语句;控制条件语句) {
    循环体语句;
    }
    第一步:先执行初始化语句,只执行一次
    第二步:执行判断条件语句
    第三部:执行循环体语句
    第四步:执行控制条件语句,然后再执行循环体语句【循环】
  • 表达式二去掉, 表示死循环。

    • 注意:分号不可以去掉

跳转语句

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {

a: for (int i = 1; i <= 5; i++) {// 行
for (int j = 1; j <= 5; j++) {// 列
if (j == 3) {
// break; // 结束内循环
break a;// 结束外循环
//continue; //第三列消失
}
System.out.print(i + "行" + j + "列\t");
}
System.out.println();
}
System.out.println("外循环后的代码。");
}

break a;结果:
1112列 外循环后的代码。

continue a;结果:
11122122313241425152列 外循环后的代码。
-------------------------------------
break 标签;和return不同
break可以执行后面的代码;retur后面的代码不执行

小数的格式化

  • java.lang   基础类库
  • java.util   工具类,集合接口
  • java.math  数学类
  • java.text    处理文本、日期、数字和消息的类和接口(格式化)

printf语句

1
2
3
4
//显示小数%f,整数%d,字符%c,布尔%b,
double sum = 3.1415927;
System.out.printf("结果是:%f\n", sum); //结果是:3.141593
System.out.printf("结果是:%.2f\n", sum); //结果是:3.14

DecimalFormat 类

  • 规则:
    • 使用0,不足用0补;
    • #代表位数
1
2
3
4
5
6
DecimalFormat df=new DecimalFormat("0000.00");
System.out.println(df.format(46.65657)); //0046.66
DecimalFormat df1=new DecimalFormat("####.##");
System.out.println(df1.format(45.654657)); //45.65
DecimalFormat df1=new DecimalFormat(".00");
System.out.println(df1.format(45.6)); //45.60