JAVA基础(三)JAVA数据类型

版权声明: https://blog.csdn.net/Geroge_lmx/article/details/88116065

        JAVA是一种强类型语言,每个变量都必须声明其数据类型,Java的数据类型分为2大类,基本数据类型和引用数据类型。

一、3类8种基本数据类型

  • 数值型:
    • 整数:byte(1字节)、 short(2字节)、 int(4字节) 、long(8字节) 
    • 浮点型:float(4字节) double(8字节)
  • 字符型:char(2字节)
  • 布尔型:boolean(1)

1) 整型

                                                 整型数据类型
类型 占用存储空间 表示范围
byte 1字节 -128 ~ +127
short 2字节 -32468 ~ +32467
int 4字节 -2e31 ~ +2e31-1(约正负21亿)
long 8字节 -2e63 ~ +2e63-1

     1个字节为8位,其中1位用来做符号位!

     java语言整型常量的4种表示形式:
         1.十进制整数,如:1,2,3...
         2.八进制整数,必须以0开头,如:013
         3.十六进制数,必须以0x或0X开头,如:0x15
         4.二进制数,必须以0b或0B开头, 如:0b00010011

    Java语言的整型常量默认为int型,long类型需要加'l'或'L'。

2)浮点型

        float类型为单精度,double类型为双精度。绝大数情况下我们使用的都是double类型,浮点型常量默认为double型。 java浮点型常量有2种表示形式:

  • 十进制表示,如:3.14
  • 科学计数法,如:314e-2或314E-2

        由于字长有限,浮点数可以精确表示的小数是有限的,因此实际浮点数也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近,但不等于。
        java.math包下面的2个有用类:BigInteger和BigDecimal,这2个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。

        雷区:不要使用浮点数进行比较!需要比较时请使用BigDecimal类!

        示例1:浮点数是不精确的,一定不可以用于比较!

public class Main {
    public static void main(String[] args) {
        // 浮点数是不精确的,一定不能用于比较
        float f=0.1f;
        double d=1.0/10;
        System.out.println(f);
        System.out.println(d);
        System.out.println(f==d);

        float d1 = 123456789f;
        float d2 = d1 + 1;
        if (d1 == d2){
            System.out.println("d1,d2相等!");
        }else {
            System.out.println("d1,d2不等!");
        }
    }
}

        运行结果如下:

       

        示例2:使用BigDecimal实现浮点数的比较

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal bd = BigDecimal.valueOf(1.0);
        bd = bd.subtract(BigDecimal.valueOf(0.1));
        bd = bd.subtract(BigDecimal.valueOf(0.1));
        bd = bd.subtract(BigDecimal.valueOf(0.1));
        bd = bd.subtract(BigDecimal.valueOf(0.1));
        System.out.println(bd);//0.6
        System.out.println(1.0-0.1-0.1-0.1-0.1);//0.6000000000000001
    }
}

        运行结果:

3) 字符型变量/常量

       字符型在内存中占2个字节,Java中使用单引号来表示字符常量。'A'表示一个字符,而"A"表示含有一个字符的字符串。String类其实是一个字符序列(char sequence)。char类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,占2个字节,允许含有65536个字符。Unicode具有从0到65535之间的编码,通常使用'\u0000'到'\uFFFF'之间的十六进制值来表示(前缀为u表示Unicode)。

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 字符
        char c = '严';
        System.out.println(c);

        // 以为可以使用Unicode编码表示一个字符
        char d = '\u4e25';
        System.out.println(d);

        // utf-8编码的字节数组
        byte[] a = {(byte)0xE4, (byte)0xB8, (byte)0xA5};
        String e = new String(a, StandardCharsets.UTF_8);// 指定decode方式,将byte[]解析为字符串
        System.out.println(e);

        // 扩展:获取字符串指定编码的字节数组
        byte[] b = "严".getBytes(StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(b));
        for (int n : b){
            System.out.print(Integer.toHexString(n & 0xFF));
            System.out.print(",");
        }
    }
}

运行结果:(有关Unicode字符集,UTF-8编码的相关内容将在JAVA基础(四)中进行详细介绍)

4) 布尔型常量

       boolean类型有2个常量值,true和false,在内存中占1位,与C不同的是,Java中不可以用0或非0的整数来代替true和false。
boolean用来做逻辑判断条件,但请不要这样写:if(flag == true),很容易犯if(flag = true)的错误。请直接使用if(flag)或if(!flag)。

二、java引用数据类型(后续再做详细介绍)

  • 接口
  • 数组

引用类型占4个字节,用来存储内存地址。

猜你喜欢

转载自blog.csdn.net/Geroge_lmx/article/details/88116065