首先先说一下==
==操作符用来比较两个变量或常量的值是否相等,也就是比较变量或常量在内存中储存的数值是否相等(这句话来自https://www.cnblogs.com/findumars/p/3746878.html 但我稍微改了一下)
然后,在最底层代码,(注意,我说的是最底层)==操作符和Object.equals(Object obj)都是值的比较,甚至Object.equals(Object obj)方法调用的就是 ==
源码如下:
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
但是,由于Java所有的类(除Object)都是Object类的子类,所以他们都可以覆盖Object类中的方法,如equals(...),所以,为了体现多态思想,为了方便,很多类都覆盖了equals()方法。而这些重新实现的equals方法就不尽相同了。下面是String类中的equals()实现
1 public boolean equals(Object anObject) { 2 if (this == anObject) { // 是否和本身比较 用的还是==,比较两个对象的地址是否相同 3 return true; 4 } 5 if (anObject instanceof String) { // 如果目标为字符串类型或他的子类 6 String anotherString = (String) anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { // 先比较长度 9 char v1[] = value; // String类中 value是个私有的char数组 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) // 比较每一个字符是否相同 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
其他的equals()实现方式各异,但基本都是比较内容是否相同。所以,equals()比较的到底是什么还真得看情况,没覆盖Object.equals的就和==一样,覆盖了,那就去看看他的源代码吧~
与之类似的还有toString()等等。