先看一段代码,来自周志明的《深入理解Java虚拟机》。

        Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);//这里有个IntegerCache -128~127的问题
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));//因为a和b都是Integer类型,算术运算后还是Integer类型,和Long不是一个类型,所以是false,请看后面源代码。equals不处理数据转型的问题,类型不一样,不会去比较值。

输出:

true
false
true
true
true
false

  先来看下java中==与equals的区别:

  ==比较引用。如果对象不是复合数据类型而是基本类型,比较的也是值。

  equals比较的是值。

再来看下Integer类中equals的源码:

  public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

再来看下原著中作者的解释:

包装类(指的是Integer这种,对比的是int)的"=="运算在不遇到算术运算的情况下不会自动拆箱,以及它们equals()方法不处理数据转型的关系。

[读书笔记]自动装箱的陷阱以及==与equals的更多相关文章

  1. java自动装箱的陷阱

    自动装箱和拆箱是java的一颗语法糖,在给我们带来使用便利的同时也带来一些疑惑,请看下面的代码: public class TestClass { public static void main(St ...

  2. (转载)Java 自动装箱与拆箱、equals和==的比较

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...

  3. 《深入理解java虚拟机》读书笔记九——第十章

    第十章 早期(编译期)优化 1.Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程.例如sun的javac.eclipseJDT中的增量编译器. JI ...

  4. 《深入理解Java虚拟机》读书笔记九

    第十章 早期(编译期)优化 1.Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程.例如sun的javac.eclipseJDT中的增量编译器. JI ...

  5. 读书笔记--C陷阱与缺陷(七)

    第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一 ...

  6. Java学习笔记之——自动装箱与拆箱

    自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte    short       char      int       long    flaot    double ...

  7. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  8. 编写高质量代码改善C#程序的157个建议读书笔记【1-10】

    开篇 学生时代,老师常说,好记性不如烂笔头,事实上确实如此,有些知识你在学习的时候确实滚瓜烂熟,但是时间一长又不常用了,可能就生疏了,甚至下次有机会使用到的时候,还需要上网查找资料,所以,还不如常常摘 ...

  9. 《C#从现象到本质》读书笔记(九)第11章C#的数据结构

    <C#从现象到本质>读书笔记(九)第11章C#的数据结构 C#中的数据结构可以分为两类:非泛型数据结构和泛型数据结构. 通常迭代器接口需要实现的方法有:1)hasNext,是否还有下一个元 ...

随机推荐

  1. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  2. classpath路径和properties

    在Java程序中,一般情况下使用绝对路径还是相对路径都不太合适,因为Java程序的jar包所放的位置不确定,执行java程序时当前的路径也不确定,所以不合适.一般在Java程序中我们会把资源放到cla ...

  3. php ob_start()、ob_end_flush和ob_end_clean()多级缓冲

    ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...

  4. angularjs ng-click

    在angularjs的controller中一段代码,展示如下: var sortList = new SortList(); sortList.setSorts([$scope.year_inves ...

  5. c# 字符串操作

    一.字符串操作 //字符串转数组 string mystring="this is a string" char[] mychars=mystring.ToCharArray(); ...

  6. Microsoft .NET Framework 4.6.1

    适用于操作系统平台:Windows 7 SP1.Windows 8.Windows 8.1.Windows 10.Windows Server 2008 R2 SP1.Windows Server 2 ...

  7. Java之使用NetworkInterface类获得网络接口信息

    转:http://www.xuebuyuan.com/1037327.html

  8. Servlet入门

    1.在tomcat中新建一个day01web应用,然后在web应用中新建一个web-inf/classes目录:2.在classes目录中新建一个FirstServlet.java文件:package ...

  9. Apache Flume 1.7.0 发布,日志服务器

    Apache Flume 1.7.0 发布了,Flume 是一个分布式.可靠和高可用的服务,用于收集.聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型.这是一个可靠.容错的服务. 本次更 ...

  10. 玩转mysql-5.7.9-winx64.zip解压版

    解压zip文件,放到D盘 追加\bin到Path环境变量 修改my-default.ini,# basedir =D:\mysql_5.7.9_winx64# datadir =D:\mysql_5. ...