让人疑惑的Java代码 - Java那些事儿

咱们先看一段代码,很简单对不对java

执行一下:数组

和大多数人内心想的不同吧,好多人还在纠结,究竟是全是true仍是全是false呀。缓存

然而一个是true,一个是false,这是为何呢?post

有的人根本不去思考,直接打开百度搜索去查找答案(一个个都是百度首席软件工程师)cdn

根据Java编译机制,.java文件在编译之后会生成.class文件给JVM加载执行,因而找到.class文件,反编译看了一下,发现编译器在编译咱们的代码时,很调皮(聪明的)的在咱们声明的变量加上了valueOf方法 ,代码变成了以下:对象

看一下valueOf方法的实现blog

咱们发现,Integer的做者在写这个类时,为了不重复建立对象,对Integer值作了缓存,若是这个值在缓存范围内,直接返回缓存好的对象,不然new一个新的对象返回,那究竟这个缓存到底缓存了哪些内容呢?看一下IntegerCache这个类:字符串

这是一个内部静态类,该类只能在Integer这个类的内部访问,这个类在初始化的时候,会去加载JVM的配置,若是有值,就用配置的值初始化缓存数组,不然就缓存-128到127之间的值。get

再来看看咱们以前的代码:编译器

结论:咱们在比较两个Integer对象的值时,不管是怎么声明的,都必定要使用equals去比较,不能用==,在Java中没有重载操做符这一说,特别是从其它语言转到Java的童鞋们要注意。equals我在其它文章里已经作了详细解说,传送门:说说Java里的equals(上) - 知乎专栏

思考如下代码的执行结果:


若是喜欢本系列文章,请点赞或顺手分享,您的支持是我继续下去的动力,您也能够在评论区留言想了解的内容,有机会本专栏会作讲解,最后别忘了关注一下我。

上一篇:写在专栏前 - Java那些事儿

下一篇:Java字符串那些儿 - Java那些事儿

转载无限欢迎,但请注明「做者」和「原文地址」。转载请在文中保留此段,感谢您对做者版权的尊重。如需商业转载或刊登,请联系做者得到受权。

相关文章
相关标签/搜索