==和equals的簡單比較


前言:==和equals這個兩個東西,經常放在一塊做比較,下面我也給出一個簡單的例子,對他倆進行一個簡單的比較,先看例子,然后在看結論。(實驗環境:win7+jdk7)

1:==和equals簡單比較的實例代碼如下

public class BooleanTestMain {
    public static void main(String [] args){
        Boolean _Boolean1 = true;
        Boolean _Boolean2 = true;
        Boolean _Boolean3 = new Boolean(true);
        Boolean _Boolean4 = new Boolean(true);

        //輸入對象的hashCode和identityHashCode,當對應的類沒有重寫hashCode()方法時,hashCode和identityHashCode是一致的
        System.out.println("_Boolean1.hashCode() is : "+_Boolean1.hashCode()+"   System.identityHashCode(_Boolean1) is : "+ System.identityHashCode(_Boolean1));
        System.out.println("_Boolean2.hashCode() is : "+_Boolean2.hashCode()+"   System.identityHashCode(_Boolean2) is : "+ System.identityHashCode(_Boolean2));
        System.out.println("_Boolean3.hashCode() is : "+_Boolean3.hashCode()+"   System.identityHashCode(_Boolean3) is : "+ System.identityHashCode(_Boolean3));
        System.out.println("_Boolean4.hashCode() is : "+_Boolean4.hashCode()+"   System.identityHashCode(_Boolean4) is : "+ System.identityHashCode(_Boolean4));

        //==比較的是對象引用地址值
        System.out.println("_Boolean1==_Boolean2 is : "+(_Boolean1==_Boolean2));
        System.out.println("_Boolean3==_Boolean4 is : "+(_Boolean3==_Boolean4));
        System.out.println("_Boolean1==_Boolean3 is : "+(_Boolean1==_Boolean3));

        //equals比較的是對象的值,如果對象沒有重寫equals的話,其作用和==一樣,因為Object類的equals也是通過==來比較的
        System.out.println("_Boolean1.equals(_Boolean2) is : "+(_Boolean1.equals(_Boolean2)));
        System.out.println("_Boolean3.equals(_Boolean4) is : "+(_Boolean3.equals(_Boolean4)));
        System.out.println("_Boolean1.equals(_Boolean3) is : "+(_Boolean1.equals(_Boolean3)));

    }
}

 上例運行的結果如下:

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.BooleanTestMain
_Boolean1.hashCode() is : 1231   System.identityHashCode(_Boolean1) is : 1969344019
_Boolean2.hashCode() is : 1231   System.identityHashCode(_Boolean2) is : 1969344019
_Boolean3.hashCode() is : 1231   System.identityHashCode(_Boolean3) is : 1746959769
_Boolean4.hashCode() is : 1231   System.identityHashCode(_Boolean4) is : 756415799
_Boolean1==_Boolean2 is : true
_Boolean3==_Boolean4 is : false
_Boolean1==_Boolean3 is : false
_Boolean1.equals(_Boolean2) is : true
_Boolean3.equals(_Boolean4) is : true
_Boolean1.equals(_Boolean3) is : true

Process finished with exit code 0

2:Boolean類的部分源碼如下所示,重寫了Object的hashCode()和equals()方法

    /**
     * Returns a hash code for this {@code Boolean} object.
     *
     * @return  the integer {@code 1231} if this object represents
     * {@code true}; returns the integer {@code 1237} if this
     * object represents {@code false}.
     */
    public int hashCode() {
        return value ? 1231 : 1237;
    }

    /**
     * Returns {@code true} if and only if the argument is not
     * {@code null} and is a {@code Boolean} object that
     * represents the same {@code boolean} value as this object.
     *
     * @param   obj   the object to compare with.
     * @return  {@code true} if the Boolean objects represent the
     *          same value; {@code false} otherwise.
     */
    public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }

3:Object類的equals()方法的源碼如下所示,也是通過==來比較的

    /**
     * Indicates whether some other object is "equal to" this one.
     * <p>
     * The {@code equals} method implements an equivalence relation
     * on non-null object references:
     * <ul>
     * <li>It is <i>reflexive</i>: for any non-null reference value
     *     {@code x}, {@code x.equals(x)} should return
     *     {@code true}.
     * <li>It is <i>symmetric</i>: for any non-null reference values
     *     {@code x} and {@code y}, {@code x.equals(y)}
     *     should return {@code true} if and only if
     *     {@code y.equals(x)} returns {@code true}.
     * <li>It is <i>transitive</i>: for any non-null reference values
     *     {@code x}, {@code y}, and {@code z}, if
     *     {@code x.equals(y)} returns {@code true} and
     *     {@code y.equals(z)} returns {@code true}, then
     *     {@code x.equals(z)} should return {@code true}.
     * <li>It is <i>consistent</i>: for any non-null reference values
     *     {@code x} and {@code y}, multiple invocations of
     *     {@code x.equals(y)} consistently return {@code true}
     *     or consistently return {@code false}, provided no
     *     information used in {@code equals} comparisons on the
     *     objects is modified.
     * <li>For any non-null reference value {@code x},
     *     {@code x.equals(null)} should return {@code false}.
     * </ul>
     * <p>
     * The {@code equals} method for class {@code Object} implements
     * the most discriminating possible equivalence relation on objects;
     * that is, for any non-null reference values {@code x} and
     * {@code y}, this method returns {@code true} if and only
     * if {@code x} and {@code y} refer to the same object
     * ({@code x == y} has the value {@code true}).
     * <p>
     * Note that it is generally necessary to override the {@code hashCode}
     * method whenever this method is overridden, so as to maintain the
     * general contract for the {@code hashCode} method, which states
     * that equal objects must have equal hash codes.
     *
     * @param   obj   the reference object with which to compare.
     * @return  {@code true} if this object is the same as the obj
     *          argument; {@code false} otherwise.
     * @see     #hashCode()
     * @see     java.util.HashMap
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

 4:為了認清==比較的本質,我又多實驗了一把,如下所示

public class EquStringTestMain {
    public static void main(String[]args){
        String _String1 = "godtrue";
        String _String2 = "godtrue";
        System.out.println("_String1 value is : "+_String1+"\n_String2 value is : "+_String2);
        System.out.println("_String1 identityHashCode is :"+System.identityHashCode(_String1)+"\n_String2 identityHashCode is :"+System.identityHashCode(_String2));
        System.out.println("_String1==_String2 is : "+(_String1==_String2)+"\n");

        String _String3 = new String("godtrue");
        String _String4 = new String("godtrue");
        System.out.println("_String3 value is : "+_String3+"\n_String4 value is : "+_String4);
        System.out.println("_String3 identityHashCode is :"+System.identityHashCode(_String3)+"\n_String4 identityHashCode is :"+System.identityHashCode(_String4));
        System.out.println("_String3==_String4 is : "+(_String3==_String4)+"\n");

        String _String5 = _String1;
        String _String6 = _String1;
        System.out.println("_String5 value is : "+_String5+"\n_String6 value is : "+_String6);
        System.out.println("_String5 identityHashCode is :"+System.identityHashCode(_String5)+"\n_String6 identityHashCode is :"+System.identityHashCode(_String6));
        System.out.println("_String5==_String6 is : "+(_String5==_String6)+"\n");

        String _String7 = _String3;
        String _String8 = _String3;
        System.out.println("_String7 value is : "+_String7+"\n_String8 value is : "+_String8);
        System.out.println("_String7 identityHashCode is :"+System.identityHashCode(_String7)+"\n_String8 identityHashCode is :"+System.identityHashCode(_String8));
        System.out.println("_String7==_String8 is : "+(_String7==_String8)+"\n");

        String _String9 = _String1;
        String _String0 = _String3;
        System.out.println("_String9 value is : "+_String9+"\n_String0 value is : "+_String0);
        System.out.println("_String9 identityHashCode is :"+System.identityHashCode(_String9)+"\n_String0 identityHashCode is :"+System.identityHashCode(_String0));
        System.out.println("_String9==_String0 is : "+(_String9==_String0)+"\n");
    }
}

 上例運行的結果,如下所示(每次運行identityHashCode都不同的喲):

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.EquStringTestMain
_String1 value is : godtrue
_String2 value is : godtrue
_String1 identityHashCode is :1748462787
_String2 identityHashCode is :1748462787
_String1==_String2 is : true

_String3 value is : godtrue
_String4 value is : godtrue
_String3 identityHashCode is :247835561
_String4 identityHashCode is :1401482194
_String3==_String4 is : false

_String5 value is : godtrue
_String6 value is : godtrue
_String5 identityHashCode is :1748462787
_String6 identityHashCode is :1748462787
_String5==_String6 is : true

_String7 value is : godtrue
_String8 value is : godtrue
_String7 identityHashCode is :247835561
_String8 identityHashCode is :247835561
_String7==_String8 is : true

_String9 value is : godtrue
_String0 value is : godtrue
_String9 identityHashCode is :1748462787
_String0 identityHashCode is :247835561
_String9==_String0 is : false

5:String類相對特殊一點,再來一個栗子嘗嘗

public class EquTestMain {
    public static void main(String[]args){
        int int1 = 9;
        int int2 = 9;
        System.out.println("int1 value is : "+int1+"\nint2 value is : "+int2);
        System.out.println("int1 identityHashCode is :"+System.identityHashCode(int1)+"\nint2 identityHashCode is :"+System.identityHashCode(int2));
        System.out.println("int1==int2 is : "+(int1==int2)+"\n");

        Integer _Integer1 = 9;
        Integer _Integer2 = 9;
        System.out.println("_Integer1 value is : "+_Integer1+"\n_Integer2 value is : "+_Integer2);
        System.out.println("_Integer1 identityHashCode is :"+System.identityHashCode(_Integer1)+"\n_Integer2 identityHashCode is :"+System.identityHashCode(_Integer2));
        System.out.println("_Integer1==_Integer2 is : "+(_Integer1==_Integer2)+"\n");

        Integer _Integer3 = new Integer(9);
        Integer _Integer4 = new Integer(9);
        System.out.println("_Integer3 value is : "+_Integer3+"\n_Integer4 value is : "+_Integer4);
        System.out.println("_Integer3 identityHashCode is :"+System.identityHashCode(_Integer3)+"\n_Integer4 identityHashCode is :"+System.identityHashCode(_Integer4));
        System.out.println("_Integer3==_Integer4 is : "+(_Integer3==_Integer4)+"\n");

        Integer _Integer5 = int1;
        Integer _Integer6 = int1;
        System.out.println("_Integer5 value is : "+_Integer5+"\n_Integer6 value is : "+_Integer6);
        System.out.println("_Integer5 identityHashCode is :"+System.identityHashCode(_Integer5)+"\n_Integer6 identityHashCode is :"+System.identityHashCode(_Integer6));
        System.out.println("_Integer5==_Integer6 is : "+(_Integer5==_Integer6)+"\n");

        Integer _Integer7 = _Integer1;
        Integer _Integer8 = _Integer1;
        System.out.println("_Integer7 value is : "+_Integer7+"\n_Integer8 value is : "+_Integer8);
        System.out.println("_Integer7 identityHashCode is :"+System.identityHashCode(_Integer7)+"\n_Integer8 identityHashCode is :"+System.identityHashCode(_Integer8));
        System.out.println("_Integer7==_Integer8 is : "+(_Integer7==_Integer8)+"\n");

        Integer _Integer9 = _Integer3;
        Integer _Integer0 = _Integer3;
        System.out.println("_Integer9 value is : "+_Integer9+"\n_Integer0 value is : "+_Integer0);
        System.out.println("_Integer9 identityHashCode is :"+System.identityHashCode(_Integer9)+"\n_Integer0 identityHashCode is :"+System.identityHashCode(_Integer0));
        System.out.println("_Integer9==_Integer0 is : "+(_Integer9==_Integer0)+"\n");
    }
}

 上例運行的結果,如下所示(每次運行identityHashCode都不同的喲):

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7536 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.EquTestMain
int1 value is : 9
int2 value is : 9
int1 identityHashCode is :1401482194
int2 identityHashCode is :1401482194
int1==int2 is : true

_Integer1 value is : 9
_Integer2 value is : 9
_Integer1 identityHashCode is :1401482194
_Integer2 identityHashCode is :1401482194
_Integer1==_Integer2 is : true

_Integer3 value is : 9
_Integer4 value is : 9
_Integer3 identityHashCode is :1110594262
_Integer4 identityHashCode is :1977385357
_Integer3==_Integer4 is : false

_Integer5 value is : 9
_Integer6 value is : 9
_Integer5 identityHashCode is :1401482194
_Integer6 identityHashCode is :1401482194
_Integer5==_Integer6 is : true

_Integer7 value is : 9
_Integer8 value is : 9
_Integer7 identityHashCode is :1401482194
_Integer8 identityHashCode is :1401482194
_Integer7==_Integer8 is : true

_Integer9 value is : 9
_Integer0 value is : 9
_Integer9 identityHashCode is :1110594262
_Integer0 identityHashCode is :1110594262
_Integer9==_Integer0 is : true

 6:如上的代碼,如果看完了,也理解了,基本上結論也出來了。(建議先看下hashCode和identityHashCode 的關系

      6-1:==是比較運算符,當是基本數據類型時,比較的是變量的值,當是其他類型的對象時,用它比較的是兩個對象的引用地址值是否相等

      6-2:equals是一個方法,如果對應的類沒有重現Object類的equals()方法,則和==是一樣的作用

      6-3:identityHashCode更能間接的代表一個對象的引用地址值

      6-4:如果一個類沒有重寫Object類的hashCode方法那么hashCode和identityHashCode是一致的

      6-5:hashCode相等時使用==比較,不一定是true

      6-6:identityHashCode相等時使用==比較,一定是true

      6-7:hashCode相等時使用equals比較,也不一定是true(通常可認為是true,我們自己可以隨便定義的)

      6-8:我們通常關心的是對象值是否相當(一個值或者多個值),所以對象之間的比較一定要使用equals方法,而非==

7:參看博文如下(觀點一致,只是解釋的思路或者栗子不同)

 

Java ==和equals()的區別【詳細版】

Java中equals和==的區別

What is the difference between == vs equals() in Java?

java:String使用equals和==比較的區別

java中equals和==的區別

淺談Java中的equals和==

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM