【 Java 笔记 】== 和 equals

首先先说一下==

==操作符用来比较两个变量或常量的值是否相等,也就是比较变量或常量在内存中储存的数值是否相等(这句话来自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()等等。

道阻且长,行则将至。
原文地址:https://www.cnblogs.com/forfriendforfun/p/7820383.html