数据类型分类
基本数据类型
byte, short, int, long, float, double, boolean, char
boolean
- 占
?
个字节
官方并没有明确说明 boolean
类型在内存中占用几个字节,很多其他资料上说他占用1个字节,不过对于boolean这种只用1个bit就可以表示的类型(如只用0、1表示),即使只用了1个字节也浪费了7位空间
-
整数类型
除了最左边1位是符号位用来表示正数还是负数,其他的都用来表示数值
byte
- 占
1
个字节
- 占
- short
- 占
2
个字节
- 占
- int
- 占
4
个字节
- 占
long
float
- 占
4
个字节 - 单精度浮点数,可以表示7位有效数字
- 占
如 3.1415926
的有效数字包括了小数点前面和后面的部分加起来一共有7个,不包括小数点,那么最终的结果是 3.1315925
,因为最后1位数字 6
是第8位
- float表示的范围比int大
虽然float和int都同样占4个字节,但float表示的范围更大,是因为float有的位除了用来当作符号位和数值,还有的位用来表示次方,而int类型的4个字节除了符号位其他都是用来表示整数的
- double (推荐用这个)
- 占
8
个字节 - 双精度浮点数,可以表示15位有效数字
- 占
比float更精确,虽然比float更占空间,但对我们现在的硬件情况来说多4个字节没有什么影响,因此推荐用double
注:
1.float 类型和 double 类型在计算的时候可能出现数据不精确的情况
如 0.1+0.2
= 0.30000000000000004
,所以在涉及金钱的计算时,都不会使用 double 或 float,用 BigDecimal
替代
char(字符类型)
用于描述单个字符,如 ‘a’、’好’等
- 用单引号表示
如'a'
- 多个字符组成字符串
String
现实生活中很少有数据能用单个字符就表示完,比如姓名、家庭地址等,所以会将多个字符连接起来,形成字符串,也就是 String
类型,在代码中用双引号表示,如"张三"
是一个字符串,由'张'
和 '三'
这两个字符组成
- 在计算机中存储的是该字符对应的十进制编号对应的二进制
计算机底层只能识别0和1,对于整数类型/浮点数类型的数字,只需要将十进制转换成二进制即可存储进计算机,但是存储这种字符类型的数据,还需要其他步骤。
给每个字符都设置一个编号,如 ‘a’ 对应的十进制编号是 97,我们再将十进制数字 97 转换成二进制后就可以存储到计算机里了,因此计算机本质上存储的就是这个字符的编号,而不是字符本身,这个编号表就是ASCII
字符 -> 字符对应的十进制编号 -> 二进制
// 以下两种声明方式虽然不同,但最终在计算机中存储的数据都是一样的
// 以字符的方式声明
char a = 'a';
// 以编号的方式声明
char b = 97;
System.out.println(a); // a 以char类型的方式展示
System.out.println(b); // a 以char类型的方式展示
System.out.println((int)a); // 97 以十进制的方式展示
System.out.println((int)b); // 97 以十进制的方式展示
- 占
2
个字节(表示范围是0~65535),没有符号位
这个范围指的是编号的范围,如字符 ‘a’ 对应的十进制编号是 97,97 在 0~65535 范围里,所以字符 ‘a’ 可以声明成 char 类型的
- java采用
Unicode
字符集编码
Unicode是世界通用的定长(所有字符都是16位)字符集。
该字符集将全世界所有字符都包含了进去,使用该字符集的好处是全世界的人都可以在java里将自己国家的文字或图案作为字符使用
引用数据类型(待更新)
数组、类、接口、枚举、标注等等
基本数据类型的字面量
什么是字面量
字面量也叫直接量
、常量
// 下面的 11, 259, 1.2 就是字面量
byte b = 11 /*字面量*/;
short s = 259 /*字面量*/;
double d = 1.2 /*字面量*/;
整数字面量
如 11, 12, 14 这种整数和 1.2, 11.2 这种浮点数的字面量的特点有区别,所以分开来说,这里先说值为整数的字面量
字面量的默认类型是int类型
// 不管字面量在不在其他基本数据类型的范围内,只要值是整数,都默认是int类型
byte b = 11 /*默认int类型*/;
short s = 259 /*默认int类型*/;
字面量的值在被赋值变量对应数据类型的取值范围外会编译报错
byte b = 259 /*byte取值范围是-128~127,259超出这个范围了,因此报错*/;
如果字面量的值在int类型取值范围外,添加后缀改为其他类型,否则编译器会报错
// 解决:我们在字面量后面加后缀可改变字面量的类型
long l = 2222222222L /*字面量设置为long类型*/;
浮点数字面量
浮点数字面量如 1.2, 11.2 这种有小数点的
字面量的默认类型是double类型
// 不管字面量在不在其他基本数据类型的范围内,只要值是浮点数,都默认是double类型
double d = 11.22 /*默认double类型*/;
float f = 1.2 /*默认double 类型*/;
如果将double类型的字面量赋值给float类型的变量编译器会报错 ```java float f = 1.1; // 即使字面量的值在float取值范围内,依然会报错,这点和整数字面量不同
// 解决:在字面量后面添加 F 后缀,表明字面量是 float 类型 float f = 1.1F;
<a name="fSV2y"></a>
## 类型转换
<a name="zDs4m"></a>
### 基本数据类型转换
<a name="scLDv"></a>
#### 自动类型转换
适用于`小类型`**到**`大类型`的转换,转换的过程自动完成,不需要我们写额外的代码 <br />判断两个类型谁大谁小的依据是他们各自对应的取值范围,如 byte的取值范围是 -128~127,short 的取值范围是-32,768~32,767,short的取值范围比byte大,因此在这个情况下byte是小类型short是大类型(不能仅通过字节大小进行比较,因为底层二进制序列结构可能不一样导致取值范围大小相差很大,如float和int虽然都占4个字节,但是float有的位用来表示次方,因此取值范围比int更大,所有在这个情况下float是大类型int是小类型)
![](https://cdn.nlark.com/yuque/0/2021/jpeg/5357399/1631494546001-f17c33db-481e-4c66-b886-982bb6835794.jpeg)<br />例
```java
byte b = 1;
short s = 2;
s = b;
强制类型转换
适用于大类型
到小类型
的转换,需要我们手动进行强制转换(可能造成数据的损失)。
格式:目标类型 变量名 = (目标类型)源类型变量名
例
/*
int 类型的变量无法直接赋值给 byte 类型的变量,是因为变量里的值是可以随时变化的,
编译器不能确定此刻的值到底是不是在 byte 类型范围内。
这和 int 类型的字面量直接赋值给 byte 类型的变量不同,字面量可以确定现在的值是否在 byte 类型范围内,
因此不会报错
*/
int i = 25;
byte b = i; // 这步编译器报错,编译器无法确定值是否一定是25,因此不能判定变量 i 中的值可以赋值给它
byte b = (byte)i; // 强制转换