避免无意识的自动装箱
首先 什么是自动装箱拆箱
自动装箱: 就是将基本数据类型自动转换成对应的包装类。
自动拆箱: 就是将包装类自动转换成对应的基本数据类型。
Integer ikun = 666; //自动装箱,爱坤粉
int small_black_son = ikun; //自动拆箱,漏出鸡爪
实现原理
自动装箱是通过对应包装类的valueOf()方法实现,我们来debug一下看看
自动拆箱则是通过对应包装类对象的 xxxValue()方法 来实现的
进入主题
我们可以从上面看出,自动装箱数值如果不是在
i >= IntegerCache.low && i <= IntegerCache.high //常量池
常量池内,是调用Integer的构造器构造一个Integer对象返回的,相当于new 了一个对象,对于有些场景的使用,我们要避免这种无意识的自动装箱,避免创建多余的对象。接下来我们来测试一下计算场景的性能差别。
我们可以看出,变量sum声明成Long的话,每次计算的时候sum都要先自动拆箱,然后跟i计算,再自动装箱,计算Integer.MAX_VALUE次相当于创建了Integer.MAX_VALUE个Long对象,然而对于计算是多余的。创建了Integer.MAX_VALUE个多余的对象,性能差距了几倍,对于应用于计算场景的,我们要避免包装对象的使用。
思考
那我们看平时的项目,对象的字段为什么基本用的包装类型呢?
简单一个点:
当我们查询数据库返回的值时null时,如果对应的字段是基础类型,是不是就报错了,基础类型不允许null。
end
对于这个小细节,我们要根据具体场景而论。对于其他场景的使用摇摆不定,写个小demo测试一下执行时间就可以很清楚了,溜咯。
参考资料: Effective Java