大家学习java时,一般都是会先去学习java的八种基本数据类型。
他们分别是:byte、short、int、long、float、double、boolean、char。
他们对应的包装类是:Byte、Short、Integer、Long、Float、Double、Boolean、Char。
那我们看看下面这段程序执行的结果会是什么呢。
01演示
大家觉得结果会是什么呢?
会是下面这样的吗?
a == b 的结果是:true
a == c 的结果是:true
d == e 的结果是:true
b == f 的结果是:true
很遗憾告诉大家上面这个结果是错误的,正确的结果是下面这个:
为什么结果是这样的呢。
02分析
我们来分析一下。
这里就涉及到了java基本数据类型的自动装箱和自动拆箱了。
像上面代码中“Integer b = 5;”这句就会用到自动装箱,会把基本数据类型的int值5自动封装成一个Integer类型的对象。
这里会用到Integer类的“public static Integer valueOf(int i)”方法。我们来看看Integer的这个方法。
这里的low是-128,high是127。也就是说如果是要对这两个值之间的int值做装箱时,是从缓存中取对应的Integer对象。如果是对不在这个范围的值做装箱时,则是新创建一个Integer对象。
这里就解释了上面代码中的一些执行结果了
a == b 的结果是false,是因为a和b是两个完全不同的对象,而“==”比较的是两个对象的地址,所以这个比较的结果就是false了。
d == e 的结果是false,是因为他们在装箱时,不在使用缓存的范围内,就各自创建了一个信息对象,两个对象的地址是不相同的,所以比较的结果就是false了。
b == f 的结果是true,是因为他们在装箱时,是在使用缓存的范围内,b和f取的是缓存中的同一个对象,所以比较的结果就是true了。
而要分析“a == c 的结果”,就要先说说自动拆箱了。这里要将Integer对象a和基本数据类型int的c进行比较时,就会自动调用Integer类的“public int intValue()”这个方法去将Integer对象拆箱转换成int值。
来看代码。
a == c 的结果是true,是因为Integer对象a拆箱后的值和c的值一样都是5(基本数据类型比较的是值),所以结果是true。
对Integer的装箱拆箱的分析就到这里。
其他数据类型的包装类里都有对应的valueOf以及**Value(如longValue等等),大家可以自行去探索一下。如果有问题,可以在评论区留言,我会给大家解答。
一本经典的java数据推荐给大家。