曾几何时,被这两个小东西折磨的要死不活的,写了无数遍的测试,发现测试结果没有一次和自己预测的一样,就像买彩票一样,当你觉得胜卷在握的时候,他突然给你来了一个180度的大反转,所以,我决定花点时间再买一次彩票,并配合这源码,预测一把结果,结果bingo!
言归正传,首先还是按照我们的3W+1H的公式来搞,
What:这都是java中用来比较的符号和关键字,主要是用来比较数据是否一致或者相等。
Where:当需要比较的数据是基本数据类型的时候,变量存储的就是直接的值,用==比较的就是直接的值,但是当比较的非基本数据类型的时候呢?变量存储的就是引用的地址,也就是对象所关联的地址。那么equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的实现

其实当使用原生的equals方法比较时,也是采用了==来比较的时引用的地址,所以还是看一段测试的代码吧

只看s2和s3的比较,因为是创建的两个对象,所以使用==的时候比较的是地址,不同的对象,指向不同的引用,所以==结果是false,equals就是比较的内容了,所以就是true了。
但是上面的s和s1的比较也很有意思,因为字符串里面有个串池的概念,所以,当abc赋值给s时,先去串池中找看看有没有这个字符串,没有就新建一个,将s指向这个串池中的这个地址,当s1来了,这时候发现串池中有,ok直接指向,所以他们两个比较就是一样的结果,另外string的equals方法是被重写的,

可见重写之后是对内容的比较了,也就是用来比较指向的字符串对象所存储的字符串是否相等,另外一些其他的也有被重写的诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。
所以综上所述来讲
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
如有不正之处,还请指出哈
网友评论