大家好,今天小编关注到一个比较有意思的话题,就是关于java语言基础语法258的问题,于是小编就整理了1个相关介绍j***a语言基础语法258的解答,让我们一起看看吧。
为什么基本类型强转object用==比较不相等?
这个是要根据基本类型与赋值进行判断的,我将从源码与例子问答该问题。
boolean、byte、char、short、int、long这六个基本类型对应的Boolean、Byte、Character、Short、Integer、Long包装类型都有一个XxxCache缓存池内部类,缓存类中存放了一些包装类型的对象数组。
下图为Integer类的内部缓存类IntegerCache,可以看出,该类内部缓存了-128~127数值的Integer数组。
下图为Integer的valueOf(int i )方法,可以看出int转Integer时会先查询参数是否在缓存值范围内,如果在就直接返回缓存数组中的整形引用,所以只要是通过Integer x = intNumber(即x = Integer.valueOf(intNumber))方式创建对象且赋值范围在缓存值范围内,引用的Integer对象都是一样的,所以无论是用equals()还是==号的结果都为true,其它非浮点型(float、)数据类型同理。当值不在缓存值范围内时,valueOf()每次都会创建一个新的堆内存空间去存放新的数值,此时通过==结果判断自然是false。
以下是一个根据题主问题写的一个==判断例子j***a与class文件
前面缓存池已经提过valueOf()是根据值是否在缓存池中判断是否创建新对象,上面第一个int值5在缓存值中,当把Integer转为Object时,传的是地址引用,所以Object c引用的是IntegerCache数组中的对象地址,故第一个输出true。
第二个int值为258超出缓存范围时,每次调用valueOf()都会新建一个新的内存空间存放该值,所以第二个bb与cc引用的地址不同,输出false。
到此,以上就是小编对于j***a语言基础语法258的问题就介绍到这了,希望介绍关于j***a语言基础语法258的1点解答对大家有用。