数据类型 字节数 默认值 取值范围 备注
    byte (字节) 1 0 -27 到27 -1(-128 到 127 )
    short(短整数) 2 0
    int(整数) 4 0
    long(长整数) 8 0
    float(单精度) 4 0.0
    double(双精度) 8 0.0
    char(字符) 2 0~65535 (\u0000~\ufffff) 用单引号,unicode字符
    boolean(布尔值) 1 false true, false
    • 整数类型
      • byte short int long
      • 整数默认是int
      • 声明long 要加 l(小写L) 或 L(大写L)
    • 浮点数
      • float double
      • 浮点数在机器中存放形式为:浮点数 = 符号位 + 指数位 + 尾数位
      • 尾数部分可能丢失,造成精度损失(小数都是近似值)
      • 浮点数默认是double,声明float要带f或F
      • float f = 11.1; // 编译报错,double转换到float可能会有损失
      • 通常情况下,应该使用double,因为比float更精确
      • 浮点数结算的结果不要相等比较
    • 字符类型
      • char 表示单个字符, 用单引号
      • char 本质上是一个整数,因此字符类型可以直接存放一个数字
        • chart c = 97;
        • 输出时是unicode码对应的字符
        • char 类型可以进行运算
      • 允许使用转义字符 \ 将其后的字符转变为特殊字符型常量 ‘\n’
      • public static final char MIN_VALUE = ‘\u0000’;
      • public static final char MAX_VALUE = ‘\uFFFF’;
      • Java中的char是Unicode编码。Unicode编码占两个字节,就是16位,足够存储一个汉字。
    • 字符编码
      • ASCII : 标准128个
      • ISO-8859-1:扩展ASCII 256
      • GB2312:简体中文
      • GBK:简体中文
      • BIG5: 繁体中文 台湾 香港
      • Unicode编码:65536个 全球字符
        • UTF-32:每个字符4个字节表示
        • UTF-16:每个字符2个字节表示
        • UTF-8:是一种变长的存储方式,省存储空间。字母1个字节,汉字是3个字节节。
    • 存储单位换算

      • 1byte = 8bit
      • 1KB = 1024B(B即byte)
      • 1MB = 1024KB
      • 1GB = 1024MB

        1. @Test
        2. public void test_2() {
        3. System.out.println(Byte.MIN_VALUE); //-128
        4. System.out.println(Byte.MAX_VALUE); // 127
        5. System.out.println(Short.MIN_VALUE); //-32768
        6. System.out.println(Short.MAX_VALUE); // 32767
        7. System.out.println(Integer.MIN_VALUE); //-2147483648
        8. System.out.println(Integer.MAX_VALUE); //2147483647
        9. System.out.println(Long.MIN_VALUE); //-9223372036854775808
        10. System.out.println(Long.MAX_VALUE); //9223372036854775807
        11. }
        1. @Test
        2. public void test_2() {
        3. int n = 11; // 默认就是int类型
        4. byte b = 11; //只要赋值给byte的值没有超过其取值范围,就会按照byte类型处理
        5. // byte b1 = 128; //编译报错,128超过了byte的取值范围
        6. short s = 11; //只要赋值给short的值没有超过其取值范围,就会按照short类型处理
        7. long l = 11; // 自动数据类型转换
        8. long l1 = 11L; //加L表示是一个long类型的数字
        9. }
        1. @Test
        2. public void test_2() {
        3. int n = 11; // 默认是10进制
        4. int n1 = 0b101; //前缀 0b 或者 0B 表示二进制
        5. int n2 = 017; // 前缀 0 表示八进制
        6. int n3 = 0x11; // 前缀 0x 或 0X 表示十六进制
        7. int n4 = 0b1111111111_10000000_11100; // 可以用下划线,增强可读性
        8. }
        1. @Test
        2. public void test_2() {
        3. double d = 11.1; //默认就是double
        4. double d1 = 11.1d;
        5. // float f = 11.1; // 编译报错,double转换到float可能会有损失
        6. float f = 11.1f;
        7. double d2 = 2.0E3; // 浮点数的科学计数法表示
        8. System.out.println(d2); // 2000.0 E3表示 10的3次方
        9. // 不要在数量级相差很大的浮点数之间进行运算
        10. double d3 = 5.25E20;
        11. System.out.println(d3 + 1); // 5.25E20 1被丢掉
        12. //浮点数不要比较(注意:是参与计算就不能比较,如果是声明的两个常量浮点数是相等的)
        13. double d4 = 0.1;
        14. double d5 = 0.2;
        15. double d6 = d4 + d5;
        16. System.out.println(d6); // 0.30000000000000004
        17. System.out.println(d6 == 0.3); // false
        18. // 精确计算
        19. BigDecimal num1 = new BigDecimal("0.1");
        20. BigDecimal num2 = new BigDecimal("0.2");
        21. System.out.println(num1.add(num2)); //0.3
        22. }
        1. @Test
        2. public void test_2() {
        3. char c = '中';
        4. System.out.println(c); //中
        5. System.out.println((int)c); // 20013
        6. //char是一个字符,一个字符有一个编号,因此char可以直接参与运算
        7. System.out.println(c + 100); // 20113
        8. char cc = 65535;
        9. // char cc1 = 65536; //编译报错,超过了char的两个字节能表示的最大数
        10. }
        11. //https://tool.chinaz.com/tools/unicode.aspx

        基本数据类型的 自动类型转换
        byte->short->int->long->float->double
        char->int->long->float->double
        char没有负数,因此byte和short没法包含在其取值范围内。

    • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算

      • float f = 10 + 1.1; //编译报错
      • float f = 10 + 1.1F; // 正确
    • 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换
      • byte b = 12; // 正确 当把具体数赋值给byte时,先判断该数是否在byte范围内,如果是就可以
      • short s = 12; // 正确
      • char c = 12; //正确
      • int i = 1; byte b = i; //编译报错
    • (byte、short)和char之间不会相互转换,这是规定
      • byte b = 12; char c1 = b; //编译报错
    • byte、short、char他们三者可以计算,在计算时首先转换为int类型
      • byte b = 12; short s = 12; char c = 12;
        byte b2 = b + s + c; //编译报错
        int i = b + s + c; //正确
      • byte b2 = 1; byte b3 = 2;__ _byte b5 = b2 +b3; //编译报错 ,都是byte也会转为int
    • boolean不能参与转换
    • 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型

    基本数据类型的强制类型转换

    • 强转符号只针对与最近的操作数有效,往往会使用小括号提升优先级
    • char类型可以保存int的常量值,但不能保存int的变量值,需要强转
    • byte 和 short ,char类型进行运算时,当做int类型处理
    • int i = (int)1.9;
      System.out.println(i); // 1 精度丢失
    • int n = 263;
      byte b = (byte) n;
      System.out.println(b); // 7 数据溢出
    • char n = 263;
      byte b = (byte) n; // char 可以和byte强转
      System.out.println(b); // 7 数据损失

      1. @Test
      2. public void test_9() {
      3. byte b2 = 7;
      4. int i = b2;
      5. int n = 263;
      6. byte b = (byte) n;
      7. System.out.println(b); // 7 强制类型导致 数据损失
      8. int n2 = 12;
      9. byte b1 = (byte)n2;
      10. System.out.println(b1); //12 如果int在btye范围内不会有数据损失
      11. }

      image.png

    short s = 1; s = s+1; 和 s += 1的区别

    1. public static void main(String[] args) {
    2. short s1 = 1;
    3. // s1 = s1 + 1; // 编译报错,自定提升为int
    4. short s2 = 4;
    5. //s2 = s2 + s1; // 编译报错,byte 和 short ,char类型进行运算时,当做int类型处理
    6. byte b = 127;
    7. b += 1; //正确,隐式的强制类型转换, byte
    8. System.out.println(b); // -128
    9. }