知识大全 等于还是不等于

Posted

篇首语:才华是刀刃,辛苦是磨刀石。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 等于还是不等于相关的知识,希望对你有一定的参考价值。

Java迷题:等于还是不等于?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

表面上看来这只是一些基础的问题 当真正的了解了以后你就会发现 啊 原来是这么一回事!下文是几道Java谜题 不仔细分析就会犯错哦

  等于还是不等于?

  看来看下面的一段代码

  代码片段

  public static void main(final String[] args) Integer a = new Integer( ); Integer b = ; System out println(a == b);

  这段代码的输出是什么?相信很多人都会很容易的猜到 false 因为a b两个对象的地址不同 用 == 比较时是false 恭喜你 答对了

  再看下面的一段代码

  代码片段

  public static void main(final String[] args) Integer a = ; Integer b = ; System out println(a == b);

  你可能会回答 这没什么不一样啊 所以还是false 很遗憾 如果你执行上面的一段代码 结果是true

  上面的代码可能让你有些意外 那好吧 再看看下面的这段代码

  代码片段

  public static void main(final String[] args) Integer a = ; Integer b = ; System out println(a == b);

  结果是true吗?很遗憾 如果你执行上面的一段代码 结果是false

  感到吃惊吗?那最后再看下面的一段代码

  代码片段

  public static void main(final String[] args) Integer a = Integer valueOf( ); Integer b = ; System out println(a == b);

  最后的结果 可能你已经猜到了 是true

  为什么会这样?

  现在我们分析一下上面的代码 可以很容易的看出 这一系列代码的最终目的都是用 == 对两个对象进行比较 Java中 如果用 == 比较两个对象结果为true 说明这两个对象实际上是同一个对象 false说明是两个对象

  现在 我们来看看为什么会出现上面的现象

  我们先看代码片段 最后的运行结果是true 说明a b两个对象实际上是同一个对象 但是a对象是通过调用Integer的valueOf方法创建的 而b对象是通过自动装箱创建出来的 怎么会是同一个对象呢?难道问题在字节码那里 毕竟Java程序是依靠虚拟器运行字节码来实现的

  通过jdk中自带的工具javap 解析字节码 核心的部分摘取如下

   : bipush : invokestatic # ; //Method java/lang/Integer valueOf:(I)Ljava/lang/Integer; : astore_ : bipush : invokestatic # ; //Method java/lang/Integer valueOf:(I)Ljava/lang/Integer;

  代码中我们只调用了一次Integer valueOf方法 但是字节码中出现了两次对Integer valueOf方法的调用 那么另一次是哪里呢?只可能在自动装箱时调用的 因此这段代码实际上等价于

  public static void main(final String[] args) Integer a = Integer valueOf( ); Integer b = Integer valueOf( ); System out println(a == b);

  现在问题就简单了 看jdk源代码 查看valueOf方法的具体实现

  public static Integer valueOf(int i) final int offset = ; if (i >= && i <= ) // must cache return IntegerCache cache[i + offset]; return new Integer(i);

  看到这儿 上面的代码就很明确了 对于 到 的数字 valueOf返回的是缓存中的对象 所以两次调用Integer valueOf( )返回的都是同一个对象

  我们再先看代码片段 根据上面的分析 代码片段 实际上等价于以下代码

  public static void main(final String[] args) Integer a = Integer valueOf( ); Integer b = Integer valueOf( ); System out println(a == b);

  由于 不在 到 范围内 所以两个对象都是通过new Integer()的方式创建的 所以最后结果为false

  片段 和片段 就不做具体分析了 相信读者可以自行分析

cha138/Article/program/Java/gj/201311/27590

相关参考

知识大全 已知a乘3分之7等于12分之11乘b等于15分之15乘c,并且abc都不等于0,把abc从小到大的顺序排列,说明理由

已知a乘3分之7等于12分之11乘b等于15分之15乘c,并且abc都不等于0,把abc从小到大的顺序排列,说明理由其实就是几个分数的大小判断,因为两边乘积相等,必定是一大一小相乘,有题目可知,7/3

痱子不等于湿疹

痱子不等于湿疹。痱子湿疹,存在着很多的相似之处。因此,很多人会将两者混淆。痱子湿疹都喜欢夏季出现。而且,痱子湿疹的症状也有些类似。还有就是,痱子湿疹都会引起瘙痒无论都少的相似之处,你要记住,痱子绝不等

痱子不等于湿疹

痱子不等于湿疹。痱子湿疹,存在着很多的相似之处。因此,很多人会将两者混淆。痱子湿疹都喜欢夏季出现。而且,痱子湿疹的症状也有些类似。还有就是,痱子湿疹都会引起瘙痒无论都少的相似之处,你要记住,痱子绝不等

住,不等于睡觉

聪明的中国人,仅用四个字,就把绝大部分人的绝大部分生活包裹了进去:衣、食、住、行。而其中每个字都足以是一个庞大的体系,以至于容易使人弄出许多感想、感触、感悟或者其他什么的。比如说住,就不等于睡觉。现代

知识大全 未交的应交增值税等于销项税额减进项税额加进项税额转出减已交税金,但是还有一个出口退税是该加还是该减

未交的应交增值税等于销项税额减进项税额加进项税额转出减已交税金,但是还有一个出口退税是该加还是该减应交增值税明细科目有:(9个)借方:进项税额、已交税金、减免税款、出口抵减内销产品应纳税额、转出未交增

知识大全 三个数字相加怎么等于三十

三个数字相加怎么等于三十这个问题不可能解决。因为每个数都是奇数,三个相加只能是奇数,不可能是偶数。三个数字相加等于三十9+10+11=304.9.6.2.8.7怎样三个数字相加等于另三个数字4+9+6

知识大全 七加二等于几

七加二等于几?打一字?久二加二等于几?(打一字),笨,1加1等于几,打一字田二加二加四等于多少?(打一字)“积”,“和”为“八”“一加二不等于三”,打一字。有很多谜底:土、王、干、田、圭、刊相似谜语1

宇宙探秘 一刻钟不等于15分钟

   汉语中用成语“一刻千金”来比喻时间的宝贵,这里的“一刻”是指极暂短的一段时间。“刻”这种计时单位是我们中国人创造的。在我们的日常生活中,习惯地认为“一刻”就是15分

绿色住宅不等于绿化

“绿色住宅”是近年来兴起的一种居住概念,它不只是强调绿化,而是利用自然条件和人工手段来创造一个有利于人们舒适、健康生活的环境,同时又要控制对于自然资源的使用,实现向自然索取与回报之间的平衡。近来,“绿

不性感不等于性冷淡

王女士最近很是苦恼,她虽然很爱丈夫,可不知为什么,被她丈夫亲吻、爱抚就毫无感觉。加上自己无阴毛,满脸是黄褐斑,乳房也已下垂,丈夫就怀疑她有病,说她性冷淡,可她看电视里的男女亲热镜头却有反应。她说自己虽