浅谈Java中==与equals的区别

基本数据类型和引用数据类型

  在谈==与equals区别之前,我们先来谈一谈java中堆和栈的区别,还有基本数据类型和引用数据类型的区别。

  • 基本数据类型有什么?

      八个基本数据类型:byte,short,int,long,float,double,char,boolean

  • 引用数据类型是什么?

      引用数据类型是:类,接口,数组

      具体参考下图

引用数据类型,基本数据类型和堆栈之间的关系

  • 引用类型的变量,其内存分布在堆上或者常量池(字符串变量、基本数据类型常量),需要通过new等方式来创建。堆内主要存放运行时,需要new来创建的对象。
  • 基本数据类型变量(8种基本数据类型)以及对象的引用变量,其内存分布在栈上,变量出了作用域就会自动释放。
如下图:

Java中==和equals()与上述两者的关系

  • ==操作的是栈内存中的值是否相等
  • equals比较的是堆内存中的值是否相等。
下面我们通过一些实例来证明:
  • 比较两个基本数据类型

输出结果为: a==b

  可见==b比较的是栈中的内容,a和b栈中都存放了1所以相等

  • 比较两个字符串

输出结果为: a==b

输出结果为: a.equals(b)

  在这个例子中,我们看到==和equals的作用是相同的,a==b说明a和b引用了同一个String对象。a.equsls(b)说明a和b指向的对象在堆中存储的内容相同。即a和b指向同一个对象。为什么会这样呢,因为Stirng对象在创建时,会现在String缓冲池中查看是否有相同的对象,如果有,则不创建。

  • 当再新建一个String对象

输出结果为: a.equals(b) a!=b

  此时字符串a,b为不同的对象。equals比较的是堆中的内容,a和b堆中内容都是123,所以输出a.equals(b)。而又a,b不是同一个对象。所以a,b的栈中存储的地址不一样,而==又是比较栈中内容所以输出a!=b。

总结:

  ==比较的是栈中的内容,即两个对象的地址是否为同一个。equals比较的是堆中内容是否相等,即两个对象的内容是否相同。

-------------本文结束感谢阅读-------------