让人疑惑的Java代码

作者: 清浅池塘V | 来源:发表于2017-09-15 23:05 被阅读86次

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

    执行一下:

    和大多数人心里想的不一样吧,好多人还在纠结,到底是全是true还是全是false呀。

    然而一个是true,一个是false,这是为什么呢?

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

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

    看一下valueOf方法的实现

    我们发现,Integer的作者在写这个类时,为了避免重复创建对象,对Integer值做了缓存,如果这个值在缓存范围内,直接返回缓存好的对象,否则new一个新的对象返回,那究竟这个缓存到底缓存了哪些内容呢?看一下IntegerCache这个类:

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

    再来看看我们之前的代码:

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

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

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

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

    相关文章

      网友评论

      • 大炮对着虫子:Integer a=new Integer(10) 和Integer b=new Integer(10) ,两个是不同的对象开辟了两块不同的空间,a和b分别指向不同的地址。 ==比较的是虚地址,equal比较的是值。所以a!=b;当时我们班的程序猿小哥哥是这么跟我解释的,哎呀,小女心爆棚啦
        清浅池塘V:@大炮对着虫子 嘿嘿,小哥哥就是这么喜欢撩小师妹

      本文标题:让人疑惑的Java代码

      本文链接:https://www.haomeiwen.com/subject/lrnesxtx.html