前言
基本数据类型与包装类型:
什么是基本数据类型?什么是包装类型?
装箱拆箱
什么是装箱?什么是拆箱?
怎么进行装箱的?
为什么这样设计?
如何进行拆箱
有了基本数据类型为什么还要有包装类型?
包装类的缓存机制
总结
在面试的时候面试官给我了几行代码如下:
面试官: 下面输出的结果是什么?
我: 第一个 true , 第二个 false;
面试官: 为什么?
我: ???????
public class Demo1 {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // false
}
}
接下来我们看着源码刨析下这个问题以及该从哪些方面回答。
基本数据类型:
java中有八大数据类型:byte、sort、char、int、long、float、double、boolean。
它们默认值分别是:0,0,'_',0,0,0.0,0.0,false.
包装类型:
每一个基本数据类型都对应一个包装类型:
byte - Byte / sort - Sort / char - Character / int - Integer / long - Long / float - Float / double - Double / boolean - Boolean
它们默认值都是: null
装箱是基本数据类型转换成对应的包装类型。(通过 valueOf( ) 方法进行转换)
public class Demo2 {
public static void main(String[] args) {
Integer i = new Integer(127); // 装箱
Integer i1 = Integer.valueOf(127); // 装箱
Integer i2 = 127; // 装箱
System.out.println("i: " +i.hashCode()); // 127
System.out.println("i1: " +i1.hashCode()); //127
System.out.println("i3: " + i2.hashCode()); //127
System.out.println(i1 == i); // false
System.out.println(i == i2); // false
System.out.println(i2 == i1); //true
}
}
拆箱是包装类型转换成对应的基本数据类型。 (通过 x.xxxValue() 方法进行拆箱)
public class Demo3 {
public static void main(String[] args) {
Integer it = 127;
int i1 = it;
int i2 = it.intValue();
System.out.println(it == i1); // true
System.out.println(it == i2); // true
System.out.println(i1 == i2); // true
}
}
一、Integer i1 = new Integer();
我们以 Integer 为例:
这种装箱方式在堆区开辟空间,所以两个不一样的对象地址不同返回false,没有使用到IntegerCa
che
源码: 直接将 int 值赋值操作并创建对象。
二、Integer i1 = 127;
为什么第一个输出 true,而第二个输出 false 呢?
看下源码:
我们可以了解到这种方式装箱通过 valueOf的方式进行创建一个 Integer 对象,并使用了一个 IntegerCache 整形缓存来进行了一次比较,这个是什么呢?
我们再查看下源码可知:
IntegerCache 是一个Integer 类型的数组,数值范围再 -128 - 127 之间,如果装箱的数值在这个范围内,直接返回这个对象,否则创建一个新的对象。
设计者认为我们使用的数值大部分是100 以内,为了节省内存资源的消耗,频繁创建对象的性能消耗,所以指定了这个规则。
以 Integer 类型为例:通过 intValue( ) 进行装箱操作
我们看下源码:
我们可以知道,包装类型底下还是保存一个 int ,并且被 final 修饰保证安全。
面试官: 包装类型存在的意义是什么?
我:
java是面向对象的语言,我们操作的一切其实都是对象,比如在集合类中,我们只能操作对象,这时候基本类型就不适用了,对基本类型提供对象类,可以增加对基本类型的操作,实现更多的功能。
面试官:那可以再解释一下包装类的缓存机制么?
我: 缓存机制是为了节省内存,降低性能消耗的一种方法,在规定的范围内可以直接调用同一对象而不去重新创建。不是所有的包装类型都有缓冲机制如 Byte、short、Integer、Character、Long具有缓存机制,范围都是 -128 - 127。当需要频繁的使用同一对象的时候,如果有缓存,则可以避免重复创建同一对象,节省空间开销和时间消耗,提升了性能。
面试官:50w年薪明天来上班!
面对这个问题的时候,我们先看着代码给出结果,随着面试官的深入,解释为什么会存在包装类型及区别如默认值,及包装类的缓存机制及存在的价值。