目录
1. 什么是包装类
基本数据类型对应的类类型就是包装类。
2. 包装类赋值
3. 装箱(装包)和拆箱(拆包)
装箱:把基本数据类型变成对应的包装类型
自动装箱:
(红色框框)
我们发现,底层会默认调用valueOf方法。
手动装箱:
(蓝色和橘色框框)
拆箱:把包装类型变成基本数据类型
自动拆箱:
我们发现,底层会默认调用intValue方法。
手动拆箱:
手动调用doubleValue方法
4. 面试题:下面代码输出什么?为什么?
对于引用数据类型来说,== 比较的是里面存的地址。
原因分析:
首先,自动装箱,调用了valueOf方法。
可以看到:
当 i 在 [low,high] 这个范围内,会返回一个数组的元素。否则返回一个新的对象。
我们可以大胆猜测,a1等于a2,a3不等于a4的原因就是一个走了上面分支,一个返回了新对象。
那么,
我们可能会有以下疑问:low 和 high是多少?cache又是个什么东西?
所以 low = -128,high = 127
看绿色框框,cache数组被static 和 final 修饰,static表示唯一,final修饰引用cache,表示引用中的值不能修改,即引用的指向不能改变,只能指向cache这个数组
由上述代码可知,cache数组长度为:127-(-128)+1 = 256 数组的每个元素都是一个Integer对象
0下标放的-128,1下标放的-127 ...... 255下标放的127
所以,当我们赋的值在-128~127之间时,都会去数组cache里面取值,每次取的都是同一个Integer对象,是同一个地址,所以a1等于a2
当赋的值不在这个范围内,就会new对象,得到的是新的地址。所以a3不等于a4。
好处:这些频繁使用的小的数据,不需要每次使用都进行创建对象了。
5. 题目2
a1和a3赋值方式底层是一模一样的。会调用valueOf方法。100在-128~127之间,取的是同一个数组下标,地址一样,所以a1等于a3
而a2直接new了一个对象。地址不一样。所以a2不等于a1,也不等于a3。