1.基本数据类型
Java有8中基本数据类型,分别是:
- 6种数字类型:整型(byte、short、int、long)、浮点型(float、double)
- 1种字符类型:char
- 1种布尔型:boolean
1. 整型(4种)
| 类型 | 大小(字节) | 取值范围 | 默认值 | 示例 |
|---|---|---|---|---|
byte |
1字节 (8位) | -128 到 127 | 0 |
byte b = 100; |
short |
2字节 (16位) | -32,768 到 32,767 | 0 |
short s = 500; |
int |
4字节 (32位) | -2³¹ 到 2³¹-1 (约 ±21亿) | 0 |
int i = 100000; |
long |
8字节 (64位) | -2⁶³ 到 2⁶³-1 | 0L |
long l = 10000000000L;(需加L后缀) |
2. 浮点型(2种)
| 大小(字节) | 精度 | 默认值 | 示例 | |
|---|---|---|---|---|
float |
4字节 (32位) | 单精度(6-7位小数) | 0.0f |
float f = 3.14f;(需加f后缀) |
double |
8字节 (64位) | 双精度(15位小数) | 0.0d |
double d = 3.1415926535;(可省略d) |
3. 字符型(1种)
| 类型 | 大小(字节) | 取值范围 | 默认值 | 示例 |
|---|---|---|---|---|
char |
2字节 (16位) | Unicode字符(\u0000 到 \uffff) | \u0000 |
char c = 'A'; 或 char c = '\u0041'; |
4. 布尔型(1种)
| 类型 | 大小(官方未明确定义) | 取值 | 默认值 | 示例 |
|---|---|---|---|---|
boolean |
通常1位或1字节 | true/false |
false |
boolean flag = true; |
2.包装类型
这8种类型对应的包装类型分别是:Byte、Short、Integer、Long、Float、Double、Character、Boolean
他们跟基本数据类型的区别是什么:
1.用途:除了一些局部变量和常量外,平时很少使用基本类型。一般方法的参数或者对象属性的类型,都会使用包装类型。包装类型可以用于泛型,基本类型不可以。
2.储存位置:基本数据类型的局部变量一般储存在Java虚拟机栈的局部变量表中,成员变量未被static修饰的,都放在Java虚拟机的堆中;而包装类型属于对象类型,实际上大多数对象类型的实例都被存放在Java虚拟机的堆中
3.占用空间:相比于包装类型,基本类型占用的空间一般都会小很多
4.默认值:包装类型的成员变量不赋值的话就是null;而基本类型都有默认值且不是null
5.比较方式:基本数据类型可以用 “==”来进行比较;而包装类型都是用equals()进行值比较,对象类型的“==”就是在比较这两个对象内存地址是不是相同。
注意:为什么说几乎所有对象的示例都放在堆中呢?因为在HotSpot虚拟机在引入JIT优化之后,会对对象进行逃逸分析,如果发现一个对象并没有逃逸到方法外部,就会进行标量替换,把对象分配到栈中,避免在堆上分配内存。
3.自动装拆箱
1.什么是自动装拆箱,原理是什么?
就是基本类型和包装类型相互转换。举例:
Integer num = 10;//装箱
int i = num; //拆箱
从他们的.class文件来看,num=10的地方用了Integer.valueof(10)方法,i=num的地方,用的是num.intValue()方法,也就是装箱使用的是包装类的valueOf()方法,拆箱就是使用的xxxvalue方法。
2.自动装箱拆箱引发的NPE的问题。
(1)在实体类中,比如TableA的属性Long trainerNum,然后我们使用 long trainer = a.getTrainerNum();在数据库中,这个trainerNum不是必填字段,他的默认值会是Null,然后在这里取trainer时会发生自动拆箱,这时候是Null的话,就会抛出NPE
(2)三目运算符使用不当出现的NPE
public class Main{
public static void main(String [] args){
Boolean condition = true;
Integer a = null;
System.out.println(condition?a:0);
}
}
因为0是基本数据类型int,这里需要返回数据的时候,就需要把a强制拆箱成int,由于a是null,所以会抛出NPE。
《阿里巴巴开发手册》中也提到过这个问题:
