https://www.cnblogs.com/dolphin0520/p/3780005.html

http://mxdxm.iteye.com/blog/2028196

装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。

public class Main {
public static void main(String[] args) { Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L; System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
}
}

先别看输出结果,读者自己想一下这段代码的输出结果是什么。这里面需要注意的是:当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。明白了这2点之后,上面的输出结果便一目了然:

true
false
true
true
true
false
true

  第一个和第二个输出结果没有什么疑问。第三句由于  a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),因此它们比较的是数值是否相等。而对于c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较。同理对于后面的也是这样,不过要注意倒数第二个和最后一个输出的结果(如果数值是int类型的,装箱过程调用的是Integer.valueOf;如果是long类型的,装箱调用的Long.valueOf方法)。

如果对上面的具体执行过程有疑问,可以尝试获取反编译的字节码内容进行查看。

最新文章

  1. 数据库中char与varchar类型的区别
  2. 当一个页面出现多个checkbox全选时的处理
  3. 使用mvc3实现ajax跨域
  4. Android Small插件化框架解读——Activity注册和生命周期
  5. Greedy:Cleaning Shifts(POJ 2376)
  6. iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
  7. Android 之 MediaPlayer类
  8. 【转】Android 系统菜单与自定义菜单
  9. sqlserver 批量修改表前缀
  10. [Codeforces 696D] Legen...
  11. [LeetCode] Out of Boundary Paths 出界的路径
  12. 金融量化分析【day112】:因子选股
  13. springmvc映射html文件以及解决乱码问题
  14. 基于Spark自动扩展scikit-learn (spark-sklearn)(转载)
  15. 前端开发之css
  16. Jquery的一些常见用法
  17. Unix的哲学
  18. kubernetes 实战3_命令_Configure Pods and Containers
  19. (转)shlex — 解析 Shell 风格语法
  20. uboot下的命令使用示例

热门文章

  1. 方法和函数,isinstance/issubclass/type以及反射
  2. 将vim配置成一个轻量的IDE开发工具
  3. w3cschool中jQuery测试结果总结
  4. JFinal常量配置学习笔记
  5. ABAP Netweaver和git的快捷方式
  6. Json的本地写入和读取,也可以方便在开发中数据的调试
  7. BZOJ 3873: [Ahoi2014]拼图
  8. handlebars用法
  9. ScriptMaker
  10. pandas 常用统计方法