“==”运算符的两个作用
比较基本数据类型变量
在比较两个基本数据类型变量时,是比较两个变量的数据值是否相等,要注意自动类型转换。 byte->short-> char –>int->long->float->double。比如int i=10;和double j=10.0;是否相等?因为存在类型提升,int 提升为double,结果当然是相等的。相同类型,相同数值也是必然相等。
比较引用数据类型变量
==比较两个引用数据类型变量时,比较的是两个变量的地址值是否相等,即在内存中指向的是不是同一个对象。对象c1和c2虽然属性的值相等,但在内存中指向的不是同一个地址,就会返回false。
对象s1和s2值相等但是在内存中地址不同,所以返回false
equals()方法
适用于引用型数据类型。equals()方法是属于Object类的,那么下边的c1和c2,s1和s2是否相等呢?
结果为:c1和c2不相等,s1和s2相等
我们先看一下Object类中的equals()方法的源码。如下图我们可以看到,Object根类中的equals()方法还是使用的“==”运算符来进行比较。CustomerTest这个类是自己写的,并没有重写equals方法,所比较的还是地址,和==运算符一样,返回false。
![](https://i-blog.csdnimg.cn/direct/73b14b72bd014d76a089ed6e5a4e4dc2.png)
但是String,Date,File,和包装类都重写了Object的equals方法,比较的是对象的属性值是否相等,看一下string类的equals()方法的源码,如图所示:
![](https://i-blog.csdnimg.cn/direct/f3e12ede7d804c3b932d272075af86f1.png)
我们可以对CustomerTest类的equals()方法进行重写,在idea中,alt+insert,出现自动构建菜单,选择重写equals()and hashCode(),选择方法的形参,完成创建。
测试一下,如图,c1和c2为true。
总结
== 既可以比较基本数据类型,也可以比较引用数据类型,对于基本数据类型比较值,对于引用数据类型比较内存地址
equals()方法比较引用数据类型,如果该方法没有被重写过,依然使用==进行比较内存地址,重写过的则是可以比较对象的属性值是否相等。