在警报声中学习

3-数据类型

数据类型定义

数据类型, 表示的是一组数据的集合,和基于该数据集合的一组合法操作。

  • 也就是说,数据类型不仅表示一组数据的集合,更重要的是它还限制了这组数据能够执行的操作。

  • 简单来说,数据类型 = 数据 + 操作

基本数据类型

整型

  1. byte

    1. byte类型也叫字节型,仅占1个字节内存空间,即8位。
    2. byte 是占用内存最小的整型,只有在极度需要节省空间的场合才会被使用,实际Java开发几乎不使用。
  2. short

    1. short 也叫短整型,占用2个字节内存空间,16位。
    2. 短整型只比字节型稍大,实际开发中short使用频率也不高。
  3. int

    1. int 本身就是单词integer的缩写,它就是整型的代名词,占用4个字节内存空间。
    2. int 是最常用的整数数据类型,实际开发中整数往往都是int类型的。
  4. long

    1. long 也叫长整型,占用8个字节内存空间。
    2. 当int类型不足以存储数据时,就需要使用long类型存储数据,在需要很大的整数时才需要使用long类型。

浮点型

  1. float
    1. float 即单精度的浮点数,占用4个字节内存空间,32位。
    2. float 相对于double占用空间更小,但它不如double精度高,也没有double表示范围大。
  2. double
    1. double 双精度的浮点数,占用8个字节内存空间,64位。
    2. double更精确,范围更大,是更常用的浮点数类型。

字符型

Java中的字符型只有一个,那就是char类型。

char本身就是单词"字符"character的缩写,每一个char类型变量都表示某一个字符,它具有以下特点:

  1. Java中的char类型变量占用2个字节内存空间。

  2. Java中的char类型存储字符,实际是存储了一个16位的无符号正整数值。

    注:十六位无符号数,16位全部用来存储数值,只能表示整数,取值范围是[0,65535]。

    即Java中的char类型能够表示编码值在[0,65535]范围内的的所有字符。

    使用的编码集是Unicode编码集。

字符类型只有参与数值运算时,才是编码值参与运算
其它的比如:
直接输出
拼接字符串
这些操作和数值运算没关系,那么就是直接字符参与运算

布尔类型

数据类型的取值范围

基本数据类型 字节长度 大小(位) 最小值 最大值 取值范围
byte 1字节 8bit -2^7 2^7-1 -128 ~ 127
short 2字节 16bit -2^15 2^15-1 -32768 ~ 32767
int 4字节 32bit -2^31 2^31-1 -2147483648 ~ 2147483647(21亿出头)
long 8字节 64bit -2^63 2^63-1 -9223372036854774808 ~ 9223372036854774807(大概922亿亿)
float 4字节 32bit - - 大约 ±3.403E38(有效位数7~8位)
double 8字节 64bit - - 大约 ±1.798E308(有效数字16~17位)

引用数据类型

Java当中有且仅有两种数据类型,那就是基本数据类型和引用数据类型。
只要不是四类八种基本数据类型,那么它都是引用数据类型。
因为基本数据类型很少,所以我们在Java开发中碰到的变量,非常多都是引用数据类型。
最常见的也是最常用的引用数据类型就是String,它表示字符串。

浮点数的精度问题

浮点数之所以存在精度问题,根源是因为尾数的位数是有限的。但除此之外,也和小数本身有关系

十进制小数转换为二进制

十进制正小数(0.开头)转换成二进制,先用小数部分乘以2,取结果的整数部分(必然是1或者0),

然后小数部分继续乘2

直到小数部分为0,或者已经达到了最大的位数

最终的结果(0.开头)正序排列

  • 0.1 --> 二进制0.1
  • 0.1 * 2 = 0.4 ---> 0
  • 0.4 * 2 = 0.8 ---> 0
  • 0.8 * 2 = 1.6 ---> 1
  • 0.6 * 2 = 1.2 ---> 1
  • 0.2 * 2 = 0.4 ---> 0
  • ....

二进制0.1本身就是一个无限循环小数,再加上浮点数本身的有效位数就有限
所以浮点数的0.1用double表示和float表示,完全不是同一个数

数据类型转换

自动类型转换

把小取值范围的数据类型 --> 大取值范围的数据类型

注意:

  • 1.浮点数的所有类型取值范围都远大于任何整型以及char类型

  • 2.基本数据类型的自动类型转换,全程无需写额外代码,那么它是绝对安全的吗?会不会带来数据失真呢?

    有可能

    当int --> float时就会

    long --> float

    long --> double 也会

  • 3.char类型作为数值类型,取值范围是[0,65535]。所以char类型的自动类型转换需要从int类型开始

强制类型转换

把大取值范围的数据类型 --> 小取值范围的数据类型

  • 大转小,在很多时候都会出现数据丢失失真的情况,所以这种强转是很危险的,做强转需要慎重考虑

  • 避免出现数据失真,导致程序运行异常.

表达式类型提升

如果表达式当中存在多种数据类型变量参与运算,

  • 由于表达式的运算结果是唯一的

  • 那么结果变量的数据类型将会提升到"最大取值范围"的那个。

  • 当然,如果字符串参与了表达式的拼接字符串运算

  • 那么结果一定是字符串类型,不会是其他任何类型

注意事项:

  • 1.byte,short,char类型之间只要参与运算,那么结果一定是int

  • 2.只要表达式中存在任一变量,那么表达式的最终结果数据类型就遵循"表达式的类型提升"。

posted @ 2023-02-27 20:48  颠三倒四不积极  阅读(123)  评论(0)    收藏  举报