1. Int 和Integer 的区别,Java为什么要设计成封装类型?
(考察点:面向对象的理解,封装类型的特性和功能;
Integer是基本数据类型int的封装类,在java中8大基本数据类型 它的封装类是一一对应的。他们的区别有很多,比如,
第一个,int类型,我们可以直接定义一个变量名赋值即可,但是Integer需要使用new关键字创建对象;
第二个,基本类型和Integer 类型混合使用的时候,Java会自动通过拆箱和装箱实现类型的转换;
第三个,Integer 作为一个对象类型,封装了一些方法和属性,我们可以使用这些方法来操作数据。
第四个,作为成员变量,Integer的初始值是null,int的初始值是0;
第五个,Integer 它是存储在堆内存里面,因为它是一个对象,int 类型是直接存储在栈空间(先进后出);
为什么要设计成封装类型?
我认为主要的原因是,Java本身它是一个面向对象的语言,一切的操作都是以对象作为基础的,比如说 集合里面存的元素,也只支持存储Object类型,普通类型是无法通过集合来存储的。安全性好,隐藏了实现细节,对使用者更加友好。
装箱操作,内存地址,享元模式,互用对象
2. 说说Java自动装箱与拆箱?
- 装箱就是自动将 基本数据类型 转换为 包装器类型(int-->Integer);调用方法:Integer的 valueOf(int) 方法
- 拆箱就是自动将 包装器类型 转换为 基本数据类型(Integer-->int)。调用方法:Integer的 intValue方法
3. 追问: Integer a1= 127 与 Integer a2 = 127相等吗
Integer a1= 100与 Integer a2= 100 相等吗?
考察目标:== 内存地址匹配, 装箱拆箱 ,Integer 内部的设计原理,(享元模式 通过复用对象 减少对象的创建数量,减少内存占用和提升性能)
高手回答:
a1==a2 的结果都是是True, 原因是Integer 内部用到了一个享元模式,也就是针对于-128 到127之间的数字做了一个缓存,使用Integer a1= 100这个方式 赋值的时候, java 默认会通过value 对100 这个数字进行装箱操作,从而触发了缓存机制,使得 a1和a2 指向了同一个Integer 的内存地址。
因为值都是100 ,并且默认通过装箱机制调用了valueOf方法从IntegerCache中拿到了两个完全相同的Integer实例。因此用等号比较得到的结果必然是true。
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
输出结果:
true
false
输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对
象。