DevOps

为什么 Java 中“1000==1000”为false,而”1

2022-03-04  本文已影响0人  Java老白

这是一个挺有意思的讨论话题。

如果你运行下面的代码:

image-20220304163602699

你会得到:

image-20220304163611875

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

image-20220304163623689

的时候,它实际上在内部做的是

image-20220304163632777

现在,如果我们去看valueOf()方法,我们可以看到:

image-20220304163643701

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

image-20220304163653178

指向了同一个对象。

这就是为什么我们写

image-20220304163711293

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧!

image-20220304163728601

如果本文对你有帮助的话,请不要吝啬你的赞,谢谢!

金三银四已经开始了,许多程序员朋友最近要冲击大厂,自己总结的一些面试大厂的 PDF 及其答案,免费分享给大家,希望对大家今年找工作有所帮助

下面是内容截图,需要学习的,点击这里免费领取。

Java 基础技术

img

Java 集合

img

JVM

img

多线程与高并发

img image.gif img

SSM 框架

Java 横向技术

img

数据库

img

消息中间件

img img

Linux

img

Elasticsearch

img

最后

整份文档一共有将近 300页,全部为大家展示出来肯定是不太现实的,为了不影响大家的阅读体验就只展示了部分内容,还望大家海涵,需要学习的,点击这里免费领取。

上一篇下一篇

猜你喜欢

热点阅读