j***a语言基础语法258,

kodinid 6 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言基础语法258的问题,于是小编就整理了1个相关介绍j***a语言基础语法258的解答,让我们一起看看吧。

  1. 为什么基本类型强转object用==比较不相等?

什么基本类型强转object用==比较不相等

这个是要根据基本类型与赋值进行判断的,我将从源码与例子问答该问题。

boolean、byte、char、short、intlong这六个基本类型对应的Boolean、Byte、Character、Short、Integer、Long包装类型都有一个XxxCache缓存池内部类,缓存类中存放了一些包装类型的对象数组

java语言基础语法258,-第1张图片-安济编程网
(来源网络,侵删)

下图为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文件

java语言基础语法258,-第2张图片-安济编程网
(图片来源网络,侵删)

前面缓存池已经提过valueOf()是根据值是否在缓存池中判断是否创建新对象,上面第一个int值5在缓存值中,当把Integer转为Object时,传的是地址引用,所以Object c引用的是IntegerCache数组中的对象地址,故第一个输出true。

第二个int值为258超出缓存范围时,每次调用valueOf()都会新建一个新的内存空间存放该值,所以第二个bb与cc引用的地址不同,输出false。

到此,以上就是小编对于j***a语言基础语法258的问题就介绍到这了,希望介绍关于j***a语言基础语法258的1点解答对大家有用。

java语言基础语法258,-第3张图片-安济编程网
(图片来源网络,侵删)

标签: 缓存 Integer 语言基础