java基本数据类型
通常来讲,java所有的对象都存储在堆中,对象引用存储在栈中,然后基本类型却是一个特例。由于用new创建一个对象,特别是小的、简单的变量,往往不是很有效,所以不用new来创建基本类型,而是创建一个并非是引用的“自动“变量,这个变量直接存储”值“,并置于堆栈中。
所以说,基本类型存在堆栈中(局部变量表)。
java确定每种基本类型所占存储空间的大小,不像其他大多语言那样随机器硬件架构的变化而变化,保证了可移植性
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16-bit | Unicode 0 | Unicode 2^16 - 1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15 - 1 | Short |
int | 32 bits | -2^31 | +2^31 -1 | Integer |
long | 64 bits | -2^63 | +2^63 - 1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
8种基本类型(primitive type)
- 4种整型
- byte
- short
- int
- long
- 2种浮点类型
- float
- double
- 1种用于表示Unicode编码的字符单元的字符类型char
- char
- 一种用于表示真值的boolean类型
- boolean
整型
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4字节 | - 2 147 483 648 ~ 2 147 483 647(正好超过20亿) |
short | 2字节 | - 32 768 ~ 32 767 |
long | 8字节 | - 9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
byte | 1字节 | - 128 ~ 127 |
- int类型最常用
- java中,所有的数值类型所占据的字节数量与平台无关
- 长整型数值有一个后缀L或l(如
40000000000L
) - 十六进制前缀0x或0X,八进制前缀0,如 010 对应八进制的8,容易混淆,不建议使用
- java 7 开始,加上前缀0b或0B表示二进制,还可以为数字字面量加下划线,更易读(如
0b1111_0100_0010_0100_0000
或1_000_000
表示一百万),java编译器会去掉这些下划线 - java没有任何无符号形式的整型
浮点类型
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约 +- 3.402 823 47E+38F(有效位数为 6~7 位) |
double | 8字节 | 大约 +- 1.797 693 134 862 315 70E+308(有效位数为 15 位) |
- double的数值精度是float类型的二倍(双精度数值)
- 绝大部分程序采用double类型
- float类型的数值有一个后缀
F
或f
,没有后缀F的浮点数值默认为double类型,也可以有后缀D
或d
- 十六进制表示法
64 = 16 * 2^2
可以表示成0x10.0p2
- p表示指数,尾数采用十六进制,指数采用十进制,基数是2
- 所有浮点数值计算都遵循 IEEE 754 规范,表示溢出和出错的三个特殊的浮点数值
- 正无穷大:
Double.POSITIVE_INFINITY
- 负无穷大:
Double.NEGATIVE_INFINITY
- NaN(Not a Number):
Double.NaN
- 不能检测一个特定值是否等于
Double.NaN
- 可以使用
Double.isNaN()
方法
- 不能检测一个特定值是否等于
- 正无穷大:
char类型
- 16bit,两个字节
- char类型的字面量值要用单引号括起来
- 值可以表示为十六进制值,范围从 \u0000 到 \Uffff
- char类型描述了 UTF-16编码中的一个代码单元
boolean类型
- 两个值:
false
和true
- 所占存储空间大小没有明确定义
- 整型值和布尔值之间不能进行相互转换
类型转换
两个不同数值类型进行二元操作时,先要将两个操作数类型转换为同一种类型,然后再进行计算:
- 如果两个操作数中的一个是double类型,另一个操作数就会转换为double类型
- 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型
- 否则,两个操作数都将被转换为int类型
实心箭头表示无信息丢失的转换,虚箭头表示可能有精度损失的转换
![java基本类型转换](https://img2020.cnblogs.com/blog/1556674/202005/1556674-20200520124646475-385707412.png)
基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保它获得一个默认值
基本类型 | 默认值 |
---|---|
boolean | false |
char | '\u0000'(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
上述初始化方法并不适用于”局部“变量(即并非某个类的字段),如在某个方法中定义:
int x;
变量x得到的可能是任意值,而不会被初始化为0,所以在使用前,应该对其赋值,否则java编译器会报错(不使用不会报错)。