浅谈equals和==的区别

Posted qiaoxin11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈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     }

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

技术图片

 

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

三、两者区别

  • ==

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

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

  • equals()

equals是判断两个变量或实例所指向的内存空间的值是不是相同;如果equals()方法被重写,则根据重写过程来比较

  • 通俗点讲,==是看看左右是不是一个东西。equals是看看左右是不是长得一样。

注意

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

 

以上是关于浅谈equals和==的区别的主要内容,如果未能解决你的问题,请参考以下文章

浅谈equals和==的区别

[转]浅谈Java中的equals和==

浅谈Java中的equals和==(转载)

(转)java中equals和等号(==)的区别浅谈

浅谈java中的"=="和eqals区别

面试浅谈==与equals的区别