面试官:兄弟,说说基本类型和包装类型的区别。 (qq.com)
面试官:你知道包装缓存机制吗? (qq.com)
1、包装类型可以是null,基本类型不适中
这使得包装类型可以应用于POJO,而基本类型则不好。
POJO:Plain Ordinary Java Object,简单无规则 Java 对象只有属性字段和 setter 和 getter 方法。
和 POJO 类似地,还有数据传输对象 DTO(Data Transfer Object,一般指显示层与服务层之间的数据传输对象)、视图对象 VO(View Object,封装页面上的数据)、持久化对象 PO(Persistant Object,它可以被视为与数据库中的表映射 Java 对象)。
那为什么 POJO 必须使用包装类型的属性?
数据库的查询结果可能是 null,如果使用基本类型,应自动拆箱(将包装类型转换为基本类型,例如将包装类型转换为基本类型) Integer 对象转换成 int 价值),会被抛出 NullPointerException
的异常。
2、包装类型可用于泛型,基本类型不适中
基本类型不能用于泛型,因为在使用基本类型时会编译错误。
List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceTypeList<Integer> list = new ArrayList<>();
为什么?因为泛型在编译过程中会擦除类型,最后只保留原型,而原型只能是 Object 类型及其子类-基本类型是特例。
3、基本类型比包装类型更高效
直接存储在堆栈中的基本类型的具体值,而包装类型则存储在堆栈中的参考。
与基本类型相比,包装类型占用更多的内存空间。
4、存储位置
基本数据类型的局部变量存储在Java虚拟机栈的局部变量表中,基本数据类型的成员变量存储在Java虚拟机堆中。
包装类型属于对象类型,几乎所有的对象案例都存储在堆中。
追问:JVM静态成员变量(static修改)在哪里?static 关键字详解 (qq.com)
被static修改的成员属于类,由类中的所有对象共享。
static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区的方法区。
问:你知道自动装箱和自动拆箱吗?既然有基本类型和包装类型,有时必须在它们之间转换。
将基本类型转换为包装类型的过程称为包装(boxing)。
相反,将包装类型转换为基本类型的过程称为拆箱(unboxing)。
在 Java SE5 以前开发人员要手动装拆箱,比如
Integer chenmo = new Integer(10); // int手动装箱 wanger = chenmo.intValue(); // 手动拆箱
Java SE5 为减少开发人员的工作,提供了自动装箱和自动拆箱的功能。
Integer chenmo = 10; // int自动装箱 wanger = chenmo; // 自动拆箱
问:你知道包装类型的缓存机制吗?将包装缓存机制引入JDK5,有助于节省内存。
Byte、Short、Integer、这四种包装类型的Long默认创建了相应类型的[-128、127]缓存数据;
Character在[0,127]范围内创建了数值缓存数据;
Boolean直接返回True
or False
;
浮点类型的包装类型Float
,Double
常量池技术尚未实现。(