Java 数据类型知识整理

在进行编程时,往往需要定义变量来存储值,而内存管理系统会根据存储变量的类型为变量分配存储空间,分配的存储空间只能用来存储该类型数据。

可以理解为数据类型是用来划分存储空间的大小。


Java是一种强类型语言,则必须为每一种变量声明一种类型。

Java两大数据类型:

  • 基本数据类型
  • 引用数据类型

分类图如下:
在这里插入图片描述


基本数据类型

Java内置了八大基本数据类型。四类八种:整型四种,浮点型两种,布尔型一种,字符型一种。

基本类型表格对比如下:

数据类型 字节,位数 默认值 最小值 最大值 包装类
byte(字节型) 1,8 0 -128(-2^7) 127(2^7-1) Byte
short(短整型) 2,16 0 -32768(-2^15) 32767(2^15 - 1) Short
int(整型) 4,32 0 -2,147,483,648(-2^31) 2,147,483,647(2^31 - 1) Integer
long(长整型) 8,64 0L -9,223,372,036,854,775,808(-2^63) 9,223,372,036,854,775,807(2^63 -1) Long
float(单精度字符型) 4,32 0.0f 1.4E-45 3.4028235E38 Float
double(双精度字符型) 8,64 0.0d 4.9E-324 1.7976931348623157E308 Double
boolean(布尔型) 1,8 false false true Boolean
char(字符型) 2,16 ‘u0000’ 0(u0000) 65535(uFFFF) Character

在计算机中,数据是以二进制位数来存储,1字节等于8位。

float和double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。

实际上,JAVA中还存在另外一种基本类型 void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。


整型

在Java中,一般整型变量默认位 int 类型。

  • byte

    byte类型作为最小数字来处理,占一个字节8位的二进制数,最高位 为符号位,以二进制补码表示整数。

    byte运算规则:
    正数的最高位都是 0,正数的值就是二进制表示的值。
    负数的最高位都是 1,负数的值是取反后再加1,然后加个负号得到的值。

    例如:

    1. 8位二进制数 01111111
      最高位为0表示正数,那么转换成十进制就是 127。
    2. 8位二进制数 10000000
      最高位为1表示负数,取反之后得到 01111111,转换成十进制就是127,再加1得到128,加个负号得到-128。

    所以byte的取值范围为 [-128,127]。

    使用:byte b1 = -128; byte b2 = 127;

  • short

    short类型是 2字节16位,有符号的以二进制补码表示的整数。

    使用:short s1 = -32768;short s2 = 32767;

  • int

    int 类型是4字节32位、有符号的以二进制补码表示的整数。

    Java中整型变量默认为 int 类型。

    使用:int a = 0;

  • long

    long 类型是8字节64 位、有符号的以二进制补码表示的整数。

    使用long类型时,数值后面需要加上 l或者L,不然默认位int类型。

    使用:long l = 100L;

    ​ "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。


浮点型

在Java中,浮点数的默认类型为double类型。

  • float

    float 数据类型是单精度、4字节32位、符合IEEE 754标准的浮点数。

    使用float类型时,数值后面需要加上 f或F,不然默认double类型。

    使用:float f = 10.0L;

  • double

    double 数据类型是双精度、8字节64 位、符合IEEE 754标准的浮点数。

    Java中浮点数的默认类型为double类型。

    使用:double d = 10.0;


布尔型

  • boolean

    boolean数据类型表示一位的信息。

    只有两个取值:true 和 false,用来逻辑判断。

    使用:boolean b1 = false; boolean b2 = true;


字符型

  • char

    char类型是一个单一的 16 位 Unicode 字符,占两个字节16位。

    使用:char c = ‘A’;


Java中获取基本数据类型的取值范围

Java中除布尔类型外,其它基本数据类型的取值范围的值、位数大小都以常量的形式定义在对应的包装类中

以 byte 类型为例:

byte 类型对应的包装类为 Byte


如下图:
在这里插入图片描述
在这里插入图片描述

Java中代码获取如下:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(Byte.MIN_VALUE);	//获取最小值
        System.out.println(Byte.MAX_VALUE);	//获取最大值
        System.out.println(Byte.SIZE);		//获取位数
    }
}

运行:

-128
127
8

说下我当时是怎么记各个类型的字节大小
把下面两行念五遍:
byte  short  int  long   float  double  boolean   char
1      2         4     8       4       8           1             2


引用数据类型

Java中的数组(array),类(class),接口(interface)都是引用数据类型。引用类型指向一个对象,指向对象的变量是引用变量。

例如:
在这里插入图片描述

运行:

null

引用类型的默认值为 null。

一个引用变量可以用来引用任何与之兼容的类型。


类型转换

在Java中进行混合运算时,不同类型的数据需要转换为同一类型,然后进行运算。

转换规则:
1、不能对boolean类型进行类型转换
2、不能把对象类型转换成不相关类的对象。
3、在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4、转换过程中可能导致溢出或损失精度。
5、浮点数到小数的转换是通过舍弃小数得到的。

  • 自动类型转换

    自动类型转换必须满足转换前的数据类型大小必须低于转换后的数据类型。

    下图为数值之间的转换:
    在这里插入图片描述
    图片来源于《Java核心技术卷I》

    箭头指向表示小类型向大类型自动转换,虚线箭头表示转换时可能精度损失。


    其中,int类型与char类型之间是通过 ASCll 转换的

int与char 转换如下:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        char c = 'A';	//定义一个 char 类型
        int n = c;		//c会根据 ASCll 表自动转换转换成数字(ASCll表上:字符A 对应的值是 65)
        System.out.println("转换后的值:" + n);	//输出n
		
        // int类型与char类型运算时发生自动类型转换
        System.out.println("int类型与char类型运算:n+c="  + (n + c) );
        //n与c相加时,char类型 c 会转换成int类型,转换之后会是 65 + 65 = 130;
    }
}

运行如下:

转换后的值:65
int类型与char类型运算:n+c=130

  • 强制类型转换

    在运算中,如需要将大类型值转换成小类型值需要使用强制类型转换。

    格式:(type)value 其中,value是需要转换的值,type是转换后的类型

例如:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int n = 128;	//定义一个int类型数据
        byte b = (byte) n;	//int强制类型转换为byte类型
    }
}

强制类型转换过程中可能会精度损失。


什么时候会精度损失呢?

​ 当大类型值转换成小类型值时,如果转换的值的大小不在转换后类型的取值范围内,则会发生精度损失。

​ 如上面例子:int类型数值为128,byte类型取值范围为[-128,127],128不在这个范围内,转换后会发生精度损 失


精度损失会产生什么后果?

如上面例子,int类型的数值128 强制转换成byte类型过程如下:

int类型占16位,128转换成二进制值为:0000 0000 1000 0000

byte类型占8位,int类型转换为byte类型会去掉后面8位

得到:1000 0000

最后按照Java中byte类型运算规则 转换成十进制

结果为-128。


大数值的使用

在Java中,如果使用的数值超过了 整数型,浮点型的范围,则可以使用大数值。

java.math 包中的 BigDecimal和BigInteger 类。

BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

在使用大数值运算时,不能使用 “+ - * /”等运算符,需要使用大数值类中的方式进行运算。

以BigInteger 为例:

public class Test {
    
    
    public static void main(String[] args) {
    
    
        BigInteger a = BigInteger.valueOf(10);	  //需要用valueOf方法把普通数值转换成大数值
        BigInteger b = BigInteger.valueOf(20);

        System.out.println("和" + a.add(b));		 //加法运算
        System.out.println("差" + a.subtract(b)); //减法运算
        System.out.println("积" + a.multiply(b)); //乘法运算
        System.out.println("商" + a.divide(b));	 //除法运算
        System.out.println("余数" + a.mod(b));	//取余
    }
}

运行如下:

30-102000
余数10

b = BigInteger.valueOf(20);

    System.out.println("和" + a.add(b));		 //加法运算
    System.out.println("差" + a.subtract(b)); //减法运算
    System.out.println("积" + a.multiply(b)); //乘法运算
    System.out.println("商" + a.divide(b));	 //除法运算
    System.out.println("余数" + a.mod(b));	//取余
}

}


运行如下:

```java
和30
差-10
积200
商0
余数10



——THE END——

猜你喜欢

转载自blog.csdn.net/weixin_46022868/article/details/113265109
今日推荐