Java中關係操做符「==」和equals()方法的區別

1、前言

若是問你Java中==和equals()有何區別,相信你的第一反應會回答:==比較的是它們所指向的對象地址,而equals()方法比較的是它們的內容值。實際上,這樣的回答是不全面的。java

2、關係操做符「==」

摘自《Java編程思想》一書中的原話:編程

關係操做符「==」生成的是一個boolean結果,它們計算的是操做數的值之間的關係。this

 那麼關於==的比較,無外乎如下兩種狀況。spa

  • 基本數據類型:它們的比較就是判斷值是否相同。
  • 引用數據類型:它們的比較就是判斷是不是同一個對象的引用,即其引用變量所指向的對象的地址是否相同。

、equals()方法

咱們知道,Java中全部的類都是由Object類派生出來的,在Object類中定義定義了equals()方法,其源碼以下:.net

public boolean equals(Object obj) {
        return (this == obj);
    }

也就是說,在沒有被重寫的狀況下,比較的是引用類型的變量所指向的對象的地址code

那麼,有哪些經常使用的類equals()方法被重寫了?好比String類、包裝類、Date類都是。對象

String類equals()方法源碼:blog

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

包裝類,好比Integer中equals()方法源碼:get

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

這些被重寫的equals()方法的類,比較的是引用類型的變量所指向的對象存儲的內容是否相等,即比較它們的值源碼

推薦閱讀 Java中包裝類型的大小比較

相關文章
相關標籤/搜索