表面上看来这只是一些基础的问题,当真正的了解了以后你就会发现:啊,原来是这么一回事!下文是几道Java谜题,不仔细分析就会犯错哦。
AD:
等于还是不等于?
看来看下面的一段代码:
代码片段1
public static void main(final String[] args) {
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a == b);
}
这段代码的输出是什么?相信很多人都会很容易的猜到:false,因为a、b两个对象的地址不同,用“==”比较时是false。恭喜你,答对了。
再看下面的一段代码:
代码片段2
public static void main(final String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
}
你可能会回答,这没什么不一样啊,所以还是false。很遗憾,如果你执行上面的一段代码,结果是true。
上面的代码可能让你有些意外,那好吧,再看看下面的这段代码:
代码片段3
public static void main(final String[] args) {
Integer a = 156;
Integer b = 156;
System.out.println(a == b);
}
结果是true吗?很遗憾,如果你执行上面的一段代码,结果是false。
感到吃惊吗?那最后再看下面的一段代码:
代码片段4
public static void main(final String[] args) {
Integer a = Integer.valueOf(100);
Integer b = 100;
System.out.println(a == b);
}
最后的结果,可能你已经猜到了,是true。
为什么会这样?
现在我们分析一下上面的代码。可以很容易的看出,这一系列代码的最终目的都是用“==”对两个对象进行比较。Java中,如果用“==”比较两个对象结果为true,说明这两个对象实际上是同一个对象,false说明是两个对象。
现在,我们来看看为什么会出现上面的现象。
我们先看代码片段4:最后的运行结果是true,说明a、b两个对象实际上是同一个对象。但是a对象是通过调用Integer的valueOf方法创建的,而b对象是通过自动装箱创建出来的,怎么会是同一个对象呢?难道问题在字节码那里,毕竟Java程序是依靠虚拟器运行字节码来实现的。
通过jdk中自带的工具javap,解析字节码,核心的部分摘取如下:
0: bipush 100
2: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: bipush 100
8: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 代码中我们只调用了一次Integer.valueOf方法,但是字节码中出现了两次对Integer.valueOf方法的调用。那么另一次是哪里呢?只可能在自动装箱时调用的。因此这段代码实际上等价于:
public static void main(final String[] args) {
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b);
}
现在问题就简单了:看jdk源代码,查看valueOf方法的具体实现:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i
分享到:
相关推荐
NULL 博文链接:https://fengshayage.iteye.com/blog/1390146
有意思的一本书,都是有点难度且又比较有意思的JAVA问题,比如表达式奇数性解惑、找零时刻、长整除、十六进制的趣数等等,特别是这本书的语言也很会激起我们的兴趣,先从实际生活中的故事说起,然后了解所需,最后用...
挺多java方面的迷题,下载了看看还不错,上传
描述java语言的设计缺陷
看懂源代码:如果你不懂设计模式去看Jdk、Spring、SpringMVC、IO等等等等的源码,你会很迷 茫,你会寸步难行 看看前辈的代码:你去个公司难道都是新项目让你接手?很有可能是接盘的,前辈的开发难道不用 设计模式? ...
这次Java SE的开发工具( JDK )包括了有利于开发applet和应用程序的Java运行环境( JRE环境)及命令行开发工具。 此更新版本的完整内部版本号是1.6.0_10 - b33。外部版本
java试题精选,里面带有参考答案来的。。。。。
香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀 起 了 学 习 Java的热 潮 (尤 其 是 在 大 学 生 们 中 ,出 现 了 一 批 Java迷 )。 有 人 预 言 :Java将 是 网 络 上 的 "世 界 语 ...
java 解惑 doubt Java迷题
java期末考题和Dreamweaver考题各12套
计算机等级考试Java强化测试题及参考答案.docx
原题为: 1.有5栋5种颜色的房子 2.每一位房子的主人国籍都不同 ... 这道迷题出自1981年柏林的德国逻辑思考学院。 据说世界上只有2%的人能出答案。 就连大名鼎鼎的爱因斯坦也成为此题大伤脑筋。
烟庇眶例西涝器垣衡庶锹灸龋利席凹肇棺风霄亚核镰玉萎贰攀蔽齿月檬汾原赛丝匝澡当 橱瘴翟篙筑涡喷迷惺琅惯啪镊妒贯撮或勘淌根褂慎精柳涯颂借杖扣执捐篮育膏揪涯肝滇 摆涨梅锐踪劣渣烯谩莆茨芭予蒲沤柜裙篱嗽汰抵还培...
场景题:集群服务器宕机解决⽅案 8.MongoDB和redis区别,分别何时使⽤,MongoDB讲⼀下 9.完全平衡⼆叉树简述,红⿊树简述 10.mysql引擎底层 11.索引优化(什么时候⽤索引,什么时候不能⽤) 12.索引⼯作流程 13....
本书提供了学习经典数据结构和算法的新...本书主要特点:在全书中使用Java 1.5的新特性,如泛型类型;使用行业标准统一建模语言来绘制类图和实例图;包含数百个习题、复习题和项目;本书给出了所有代码半均可在线获得。
java引发作用域笔试题Spock Arquillian 扩展 在容器中进行 BDD 测试! 它是什么? Arquillian 是在 JBoss.org 开发的测试框架,它使开发人员能够为在嵌入式或远程容器内执行的业务对象编写集成测试——选项包括 ...
初级java笔试题nand2tetris.org 第 1 部分课程文件和答案 课程详情 Nand to Tetris 课程将带您进行自定进度的迷人发现之旅,您将一路从布尔代数和基本逻辑门到构建中央处理单元、存储系统和硬件平台,直至一台可以...
第四题工程师和研究迷 我目前正在瑞尔森大学学习工程学,同时正在寻找我的第四次也是最后一次实习。 另一方面,我构建了很酷的 Python 项目并研究了混沌理论。 跟我来这里 我喜欢研究的东西 编码和辅助项目 机器学习...