数据类型

Wu Jun 2020-01-02 08:43:49
Categories: > > Tags:

数据类型分为基本类型和对象类型。

1. 基本类型

Java 中的基本类型有 8 种,其中有 4 种整型、2 种浮点型、char 和 boolean。还有 void 和 reference 类型

  1. 基本类型值存储在内存栈上。
  2. 基本类型所占空间大小固定。
  3. 所有数值类型都有正负号。

1.1 整型

类型 包装类 存储需求 取值范围 零值 备注
long Long 8 字节 64 bits -263 ~ +263-1 0L 后缀加L或l
int Integer 4 字节 32 bits -231 ~ +231-1 0 最常用,范围超20亿
short Short 2 字节 16 bits -215 ~ +215-1 (short)0 控制占用存储空间的大数组
byte Byte 1 字节 8 bits -27 ~ +27-1 (byte)0 底层文件处理
  1. 十六进制前缀 0x 或0X
  2. 八进制前缀 0
  3. 二进制前缀 0b 或 0B(Java 7 开始)
  4. 数字加下划线更易读,如 1_000_000,编译器会去掉(Java 7 开始)
  5. 没有后缀标识的整数默认为 int 类型

1.2 浮点

类型 包装类 存储需求 取值范围 零值 备注
double Double 8 字节 64 bits 大约-21024 ~ -2-1074 —— 0 —— 2-1074 ~ 21024(有效 15 位) 0.0d 后缀 D 或 d,最常用。
float Float 4 字节 32 bits 大约-2128 ~ -2-149 —— 0 —— 2-149 ~ 2128(有效 6~7 位) 0.0f 后缀 F 或 f,单精度库或大量数据
  1. 没有后缀F的浮点数默认是 double
  2. 浮点数不能绝对精确,因为二进制种无法精确表示 1/10,不允许误差应使用 BigDecimal 类。

浮点数的结构与整型不同,指数的底数为 2,尾数表示小数部分

类型 符号位(S) 指数位(E) 尾数位(M)
float 1 bit 8 bits 23 bits
double 1 bit 11 bits 52 bits

1.3 字符

类型 包装类 存储需求 取值范围 零值 备注
char Character 2 字节 16 bits int0~216-1 ,hex’\u0000’~‘’\Uffff’ ‘\u0000’ char 字面量要用单引号括起来。

1.4 布尔

boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。

JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。

JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。

整型和布尔之间不能转换,不能用 0 当作 false,可以使用条件表达式

1.5 类型转换

不要强制转换 boolean 类型,可用条件表达式

自动类型转换图示:byte -> short(char) -> int -> long -> float -> double ,强制类型与之相反

1)自动类型转换

运算或方法调用时,系统会将较小的数据类型自动转换为较大的数据类型

2)强制类型转换

强制类型将较大的数据类型转化为较小的数据类型,可能导致精度损失。

2. 包装类型

2.1 大数值

2.2 字符集和字符编码

2.3 位运算符

3. 缓存池

基本类型对应的缓冲池如下:

在使用这些基本类型对应的包装类型时,如果该数值范围在缓冲池范围内,就可以直接使用缓冲池中的对象。

3.1 IntegerCache

Integer 缓冲池 IntegerCache, 是静态类,上界可以通过参数调整。

加载的时候会初始化一个 int 数组,填上 -128 ~ 127 的值。

3.2 valueOf() 方法

valueOf() 方法会使用缓存池中的对象,多次调用会取得同一个对象的引用。

编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值在缓存池范围内的 Integer 实例使用自动装箱来创建,那么就会引用相同的对象。