• Java核心技术卷Ⅰ-第三章Java的基本程序设计结构


    重点

    1.数据类型

    2.运算符

    3.字符串

    4.控制流程

    5.数组


    1.数据类型


    • 整型:Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围是固定的;在C/C++中,int和long类型的大小与目标平台相关
    类型存储需求取值范围
    int4字节-2147483648-2147483647
    short2字节-32768-32767
    long8字节-9223372036854775808-9223372036854775807
    byte1字节-128-127
    • 浮点类型:浮点数类型不适用无法接受舍入误差的金融计算,比如2.0-1.1会打印0.8999999999999999而不是期望的0.9,这是因为浮点数采用二进制表示,而在二进制系统中无法精确表示分数1/10
    类型存储需求取值范围
    float4字节大约 ± 3.40282347 ∗ 1 0 38 \pm3.40282347*10^{38} ±3.402823471038
    double8字节大约 ± 1.79769313486231570 ∗ 1 0 308 \pm1.79769313486231570*10^{308} ±1.7976931348623157010308
    • char类型:
      • 该类型原本用于表示单个字符,现在有些Unicode字符可以使用一个或两个char值描述
      • 该类型的值可以表示为16进制值,范围\u0000-\uFFFF
    • boolean类型:在Java中整数型和布尔值不能相互转换,而在C++中数值和指针都可以转换为布尔值
    if(x=0){
        ...  // 该代码在C++中不会报错,在Java中会报错,因为x=0不能转换为布尔值
    }
    
    • 1
    • 2
    • 3

    2.运算符


    • 整数被0除将产生异常,浮点数被0除会得到无穷大或NaN结果
    System.out.println(10.0 / 0);  // Infinity
    System.out.println(10 / 0);  // 报错
    
    • 1
    • 2
    • 如果一个计算溢出,数学运算符只是返回错误结果不会提示;使用Math库会产生异常,然后就可以捕获该异常或者让程序终止
    System.out.println(1000000000 * 3);  // -1294967296
    System.out.println(Math.multiplyExact(1000000000, 3));  // 报错
    
    • 1
    • 2
    • 数据类型之间的转换:

      • 下图中实线表示无信息丢失的转换,虚线表示可能存在精度丢失的转换

      在这里插入图片描述

      int n = 123456789;
      float f = n;
      System.out.println(f);  // 1.23456792E8
      
      • 1
      • 2
      • 3
      • 试图将一个数强制转换为另一个类型,但是又超出了目标类型的范围,就截断为完全不同的数:
      double x = 9.01;
      int k = (int)x;
      System.out.println(k);  // 9
      System.out.println((byte) 270);  // 截断为14
      
      • 1
      • 2
      • 3
      • 4
      • 如果运算符左侧和右侧类型不一致,会发生强制转换:
      int x = 4;
      x += 3.5;  // 相当于x = (int)x+3.5 
      System.out.println(x);  // 输出7
      
      • 1
      • 2
      • 3
    • 位运算符

      • &&||是短路运算符:如果第一个操作数已经确定表达式的值,第二个操作数无需计算
      • $|不采用短路方式求值,如果应用在布尔值上就得到布尔值,应用在整数中就得到整数值
      boolean a = false;
      boolean b = true;
      System.out.println(a & b);  // false
      int a = 0b001;
      int b = 0b010;
      System.out.println(a | b);  // 3(即0b011)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • >>>会用0填充高位(>>使用符号填充高位),不存在<<<运算符

    3.字符串


    • 空串“”是一个Java对象,它具有自己的长度(0)和内容(空)。同时String变量还可以存储null,表示目前没有和任何对象关联
    • 字符串属于CharSequence接口,所以以CharSequence接口作为形参时可以传入String类型作为实参
    • nextLine方法读取下一行输入,next方法读取下一个单词(以空白符为分隔符)

    4.控制流程


    • Java不能再嵌套的两个块中声明相同的变量,C++可以:
    {
        int i;
         {
             int a;
             int i;  // 报错
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 循环中使用浮点数可能会无法终止,因为存在舍入误差导致达不到精确的最终值:
    for(double x = 0; x != 10; x += 0.1){
        System.out.println("float存在误差");  // 一直打印
    }
    
    • 1
    • 2
    • 3
    • switch的使用在不同的JDK版本是有区别的:

      • switch分为表达式和语句,对于Java11及之前的版本而言,只有语句,而在Java14中可以使用表达式:
      String name = "psj";
      // switch语句
      int demo = 1;
      switch (name) {
          case "psj":   // 注意case后面不能写一个范围,而是一个具体的值
              demo = 2;
              break;
          default :
              demo = 3;
              break;
      }
      // switch表达式(Java14才能使用->)
      int demo = switch(name){
      	case "psj" -> 2;
          default -> 1;  // 不能写为return 1
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 在Java14中,case可以使用逗号将多个字符串分隔:
      String s = "";
      switch(s){
          case "psj", "psj2" -> ...
      }
      
      • 1
      • 2
      • 3
      • 4
    • 在Java中可以使用带标签的break(类似goto):

    int a = 0, b = 0;
    read_data:  // 此时while为带标签的语句块,如果满足if(b == 100)就会跳转到带标签的语句块末尾
    while (a < 100) {
        a++;
        b += 50;
        if (b == 100) {
            break read_data;
        }
    }
    System.out.println(a);  // 3
    System.out.println(b);  // 100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.数组


    • new int[0]new int[]{}可以创建长度为0的数组,并且长度为0不等于null

    • 要使用forEach循环必须是一个数组或者是实现了Iterable接口的对象

    • Java中可以将数组变量拷贝到另一个数组变量(即两个变量引用同一个数组)

    int[] a = {1,2};
    int[] b = a;
    b[0] = 3;
    System.out.println(a[0]);  // 3
    System.out.println(b[0]);  // 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • main方法中常见的String[] args的含义如下:
    在命令行输入:java Test -g a b
    agrs[0]:"-g" agrs[1]:"a" agrs[2]:"b"
    
    • 1
    • 2
    • 要快速打印二维数组可以使用Arrays.deepToString(xxx)
    int[][] a = {{1, 2}, {2, 3}};
    System.out.println(Arrays.deepToString(a));  // [[1, 2], [2, 3]]
    
    • 1
    • 2
    • 要创建一个不规则的数组(即每一行的长度不同),使用int[][] a = new int[10][]

    其他知识点


    • 类名必须以字母开头(可以使用$_开头,但是标准命名是以大写字母开头,如果名称有多个单词组成则每个单词首字母大写),后面可以跟字母和数字的任意组合(也可以使用$_,但是没有意义),长度没有限制,但是不能使用Java保留字

    • 作为变量名的标识符由字母(可以是某种语言中表示字母的任意Unicode字符)、数字(表示数字的Unicode字符也可)、货币符号($、¥等)和标点连接符(_和波浪线等)

    • 从Java10开始,如果可以从变量的初始值推断变量类型,则不需要声明类型,使用var即可:

    var a = 10;
    
    • 1
    • final表示该变量只能被赋值一次,赋值后就不能更改,并且全部使用大写表示

    • java.math包中,BigInteger类实现任意精度的整数运算,BigDecimal实现任意精度的浮点数运算,这两个类都可以处理包含任意长度数字序列的数值

  • 相关阅读:
    图论06-【无权无向】-图的遍历并查集Union Find-力扣695为例
    关于文件上传的前后端优化
    关于 国产麒麟系统运行Qt,在命令行可以运行而双击无法运行(无反应) 的解决方法
    Gin 中使用日志
    MATLAB中findpeaks函数使用
    JAVA实现SAP接口
    LeetCode46:全排列
    给定一个整数N,代表你有1~N这些数字。在给定一个整数K。你可以随意排列这些数字,但是每一种排列都有若干个逆序对。返回有多少种排列,正好有K个逆序对。
    用python+vue实现一个计算页面
    element el-popover自动关闭问题
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128080194