Java迷题:等于还是不等于?

作者&投稿:除是 (若有异议请与网页底部的电邮联系)
~ 表面上看来这只是一些基础的问题 当真正的了解了以后你就会发现 啊 原来是这么一回事!下文是几道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

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

lishixinzhi/Article/program/Java/gj/201311/27590




打游戏适合用哪种键盘?
常见的FPS游戏有CS、CF、战地之王AVA、CSOL、COD等等。游戏玩家必看 哪款机械键盘最适合你 完 CS:...AVG的特色是故事情节往往是以完成一个任务或解开某些迷题的形式出现的,而且在游戏过程中刻意强调谜题的...这类游戏其实对键盘的要求不高,玩家选择按键反应灵敏的键盘即可,如果是两人一起玩游戏还需要选择一款键位...

星际争霸游戏中关于扎玛拉的剧情都有哪些
Zamara还向他展示了Ulrezaj是如何派他的奴才来刺杀她,Alzadar的所作所为正在帮他害死保管者。 一行人以Dahl为诱饵引出了Alzadar,埋伏了他并且给他解了毒,然后他就重回了Khala。 Zamara要取得Savassan和Temlaa曾经呆过的房间中的高纯Khaydarin水晶,但Xava'tor宣称这房间即使对Tal'darim来说也是禁忌。Zamara最终 ...

现在什么游戏最火
1、绝地求生刺激战场 大吉大利,今晚刺激!《绝地求生:刺激战场》作为绝地求生正版手游,完美还原端游的纯正游戏体验。虚幻4引擎研发,次世代完美画质,重现端游视听感受;8000Mx8000M正版实景地图,打造指尖战场,全方面自由施展战术;百人同场竞技,真实弹道,完美的射击手感;好友一键组队,语音开黑;腾讯光子工作...

关于柯南的问题
22、出冷谜语和拆解冷笑话:至今出过2个谜题,其中一个难倒了柯南(最后费了好大劲解开了),其中一个难倒了步美、光彦和元太(也是最后费了好大劲解开了)...——BY AVA_巫婆 19、小哀,记得要忘记。 ——BY 默哀 20、哀殿,希望在最后的最后能看到你,笑靥如花。 ——BY Haibara涵 21、灰原,你要记住柯南说过...

关于恐龙的资料
二、鸟臀目(鸟龙目)主要特征是组成腰带的骨骼结构形式与鸟类相似,耻骨指向后方,即为四射型或四放型腰带,另外还具有前齿骨和颊肌。下分五个亚目: (一)鸟脚亚目:禽龙、鸭嘴龙等。 (二)角龙亚目:原角龙、角龙、鹦鹉嘴龙等。 (三)甲龙亚目:结节龙、棘龙、甲龙等。 (四)剑龙亚目:剑龙等。 (五)钟头龙亚目:...

你喜欢剧本杀吗?乐趣在哪里?
我很喜欢玩剧本杀,基本上有利于提高社交能力和思维能力。“剧本杀”,一词起源于西方宴会实况角色扮演“谋杀之谜”,是玩家到实景场馆,体验推理性质的项目。剧本杀的规则是,玩家先选择人物,阅读人物对应剧本,搜集线索后找出活动里隐藏的真凶。“剧本杀”有线上和线下“打本”两种方式。线上App提供的...

现在什么游戏比较好玩
详情请查看视频回答

什么游戏最好玩?
详情请查看视频回答

什么网络游戏好玩
《逍遥情缘》。《逍遥情缘》是深圳天穹网络研发运营的2.5D角色扮演类冒险回合制网游;该游戏于2017年10月17日开启首次封测,2018年3月23日开启不删档内测,2018年7月20日正式开始公测。游戏背景设定:相传在上古时期,人魔仙三族原本和睦共处,神州大地一片繁荣景象。然而有些别有用心之人,为了获得无尽...

关于恐龙的资料,世界上有多少恐龙。
现在我们还知道,恐龙根本就不是蜥蜴。它们虽然都属于爬行动物,但是在门类繁杂的爬行动物大家族中,恐龙...蜥脚亚目的著名代表有产于我国四川、甘肃晚侏罗纪由19节颈椎组成的脖子长度约等于体长的一半的马门溪...(Avaceratops) 奇迹龙(Agathaumas) 劣牙龙(Dysganus) 无鼻角龙(Arrhinoceratops) 弱角龙(Bagacerato...

广西壮族自治区15226797411: 求人解惑,java等于和不等于运算符的程序 -
太韵八味: i与j是两个整形变量,值都是4,所以i==j的值是true 即b1的值为true,b2的值为false s1与s2是两个不同的对象,值都是空,因为对象中用==是判断是否为同一个对象,而不是判断对象内容(equals判断内容) 即s1.equals(s2)的结果是true,而s1==s2的结果为假(因为s1与s2不是同一个对象),故b3的值为false,b4的值为true

广西壮族自治区15226797411: java,equals是等于,那不等于怎么表达,求教 -
太韵八味: 1 2 3 4String st1 = "hello"; String st2 = "hello"; st1.equals(st2); //true !st1.equals(st2);//false 前边加叹号!

广西壮族自治区15226797411: java,equals()是等于,那不等于怎么表达,求教! -
太韵八味: !objectA.equals(objectB) 还有一种是compareTo() objectA.compareTo(objectB)!=0

广西壮族自治区15226797411: 在java中=和==的区别是什么? -
太韵八味: =是赋值, == 是判断.1、a=b就是把b的值赋予给a.2、a==b就是判断a等于b. 3、用==语句一般情况都是在要前面加if语句,作为判断if a==b 执行什么.

广西壮族自治区15226797411: java里的 “!=” 和“==”什么意思呀 -
太韵八味: == 是比较两个对象地址是否相等, =是赋值,如:a="2",把2赋值给a了, != 是不等于,n==0就是 n等于0,答案是 false

广西壮族自治区15226797411: JAVA 的不等于语句怎么写 -
太韵八味: //字符串的不等于 if ( ! "aoiewjro".equals("bio") ){ }

广西壮族自治区15226797411: Java中“==”和“=”的区别 -
太韵八味: = 赋值 int a = 1;== 判断 int a = 1; int b = 1; int c = 2; if (a==b) { System.out.println("a == b"); } else if (a == c) { System.out.println("a == c"); } else { System.out.println("a != b and a != c"); }

广西壮族自治区15226797411: java中!=是什么意思? -
太韵八味: 不等于,比较运算符

广西壮族自治区15226797411: java的“=” 和“==”分别是什么意思 -
太韵八味: =是赋值 ==是等于

广西壮族自治区15226797411: 【高分急求】Java里“==”和“=”的区别是什么,求详细.
太韵八味: ==表示判断,返回值是true或者false,布尔值,例如1==2,返回false,因为1不等于2.而=表示赋值,例如a=b,表示将b的值赋给a!!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网