优秀的软件工程师们!! 你们好,别一个人纠结了,我想要创建一个程序员交流社群,大家一起交流技术,分享面试心得。 在这里邀请大家进入交流哦[脱单doge][脱单doge](私信我留下你的V)
问题分析
按照大家对于Java基础的认知,两个独立的对象用==进行比较,是比较两个对象的内存地址。
那得到的结果必然是false。但是在这个场景中,得到的结果是true。
为什么呢?
首先, Integer a1=100, 把一个int数字赋值给一个封装类型,Java会默认进行装箱操作,也就是调用Integer.valueOf()
方法,把数字100包装成封装类型Integer。
其次,在Integer内部设计中,用到了享元模式的设计,享元模式的核心思想是通过复用对象,减少对象的创建数量,
从而减少内存占用和提升性能。
Integer内部维护了一个IntegerCache,它缓存了-128到127这个区间的数值对应的Integer类型。
一旦程序调用valueOf 方法,如果数字是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。
否则,就会创建一个新的对象。
所以,对于这个面试题来说,两个Integer对象,因为值都是100,并且默认通过装箱机制调用了valueOf方法。
从IntegerCache中拿到了两个完全相同的Integer实例。
因此用等号比较得到的结果必然是true。
讲人话
a1==a2的执行结果是true
原因是Integer内部用到了享元模式的设计,针对-128到127之间的数字做了缓存。
使用Integer a1=100这个方式赋值时,Java默认会通过valueOf对100这个数字进行装箱操作,
从而触发了缓存机制,使得a1和a2指向了同一个Integer地址空间。
以上就是我的理解。