面试官:int和Integer有什么区别?
回答思路:
原始数据类型和包装类介绍
主要区别(数据+使用+内存)
自动装箱、自动拆箱机制和实践原则
回答总结:
int 是8种基本数据类型(byte、boolean、char、short、int、long、float、double)之一,表示整型数据类型,虽然Java是面向对象语言,以对象贯穿整个思维,但是基本数据类型不是对象;
Integer是int对应的包装类,它有一个int类型存储数据,并且提供了基本的数学运算、类型转换的操作方法,它是一个Java对象,可以通过new的方式创建;Integer的方法实现和String一样,都是final修饰的不可变,所以线程安全;
两者的区别:
1.初始角度:基本数据类型有默认值,包装类是对象没有默认值;
2.使用角度:Java泛型不支持基本数据类型,但支持包装类;
3.内存角度:包装类型比基本数据类型占用空间更大(下面列举占用内存的结构)。
在JDK1.5开始提供了基本数据类型和包装类之间的自动装箱、自动拆箱功能,据上下文自动转换类型,极大简化了编程;自动装箱是Integer.valueOf(),自动拆箱调用的是Integer.intValue();(这里静态工厂方法valueOf()会用到缓存,但是调用new方法不使用缓存哦)
在开发实践中,要尽量避免无意识的拆箱和装箱。简单来说(个人理解不一定对)在用于计算场景的时候多用int等基本数据类型,在实现业务开发的时候大多使用Integer等包装类型。
扩展:Java对象的内存结构(《深入理解Java虚拟机》中内容)
基本数据类型:实际类型占用内存大小是多少就是多少
对象类型:对象头 + 实例数据 + 对齐数据;
数组类型:对象头 + 数组长度 + 实例数据 + 对齐数据
其中:对象头主要组成是4字节的markwork和4字节的class对象指针