3-数据类型
数据类型定义
数据类型, 表示的是一组数据的集合,和基于该数据集合的一组合法操作。
-
也就是说,数据类型不仅表示一组数据的集合,更重要的是它还限制了这组数据能够执行的操作。
-
简单来说,数据类型 = 数据 + 操作
基本数据类型
整型
-
byte
- byte类型也叫字节型,仅占1个字节内存空间,即8位。
- byte 是占用内存最小的整型,只有在极度需要节省空间的场合才会被使用,实际Java开发几乎不使用。
-
short
- short 也叫短整型,占用2个字节内存空间,16位。
- 短整型只比字节型稍大,实际开发中short使用频率也不高。
-
int
- int 本身就是单词integer的缩写,它就是整型的代名词,占用4个字节内存空间。
- int 是最常用的整数数据类型,实际开发中整数往往都是int类型的。
-
long
- long 也叫长整型,占用8个字节内存空间。
- 当int类型不足以存储数据时,就需要使用long类型存储数据,在需要很大的整数时才需要使用long类型。
浮点型
- float
- float 即单精度的浮点数,占用4个字节内存空间,32位。
- float 相对于double占用空间更小,但它不如double精度高,也没有double表示范围大。
- double
- double 双精度的浮点数,占用8个字节内存空间,64位。
- double更精确,范围更大,是更常用的浮点数类型。
字符型
Java中的字符型只有一个,那就是char类型。
char本身就是单词"字符"character的缩写,每一个char类型变量都表示某一个字符,它具有以下特点:
-
Java中的char类型变量占用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.只要表达式中存在任一变量,那么表达式的最终结果数据类型就遵循"表达式的类型提升"。

浙公网安备 33010602011771号