• 浅谈equals和==的区别


    这个问题在面试或者源码分析都经常出现,先不着急,让我们来了解一下Java中的数据类型。

    java中的数据类型分为: 基本数据类型和引用数据类型。

    基本数据类型

    • 4种整数类型:int、long、byte、short  
    • 2种浮点数类型:float、double  
    • 1种字符类型:char  
    • 1种布尔类型:boolean

    引用数据类型

    • 接口
    • 数组

    一、==

    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

    • 对于基本数据类型来说,== 比较的是值是否相等

    如:int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

    • 对于引用数据类型来说,== 比较的是两者在内存中存放的地址(堆内存地址)
    • 两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

    二、equals

    1.equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    2.equals方法最初是在所有类的基类Object中进行定义的,源码是

    1 public boolean equals(Object obj) {
    2     return (this == obj);
    3     }

    我们可以从这段源码看出,在没有重写equals方法之前,equals方法里是直接调用==,因此实质上与==没有差别。但是要注意:equals方法不能作用于基本数据类型的变量,这是因为基本数据类型非对象的缘故,没有方法。

    3.由于类的多态,如果我们重写了equals()方法,那么判断结果将为我们自己定义。下面来看下String类重写的方法:

     可以看出,String的equals()方法仅仅是对比它的数据值,而不是对象的内存地址,所以不管String对象的内存地址是否相同并不影响其结果,equals()比较的仅仅是数据值。

    三、两者区别

    • ==

    基本类型:对比它们的值是否相等

    引用类型:对比它们的内存地址是否相等

    • equals()

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

    注意

    另外,"=="比"equals"运行速度快,因为"=="只是比较引用。

  • 相关阅读:
    Python编码风格
    CI持续集成—记一次jenkins安装及ldap配置
    mysql主从同步失败处理
    redis优化
    sysbench
    Ubuntu12.04 Installation and Subversion(svn)
    MySQL 5.7 CLUSTER NDB 7.5 创建磁盘表 undo logfile group tablespace 内存表修改为磁盘表
    Java异步调用Future对象
    Java宝典(二)
    Java宝典(一)
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/12543109.html
Copyright © 2020-2023  润新知