zoukankan      html  css  js  c++  java
  • ==和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 FilesJavajdk1.7.0_71injava" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.7.0_71jrelibcharsets.jar;C:Program FilesJavajdk1.7.0_71jrelibdeploy.jar;C:Program FilesJavajdk1.7.0_71jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.7.0_71jrelibextdnsns.jar;C:Program FilesJavajdk1.7.0_71jrelibextjaccess.jar;C:Program FilesJavajdk1.7.0_71jrelibextlocaledata.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunec.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunmscapi.jar;C:Program FilesJavajdk1.7.0_71jrelibextzipfs.jar;C:Program FilesJavajdk1.7.0_71jrelibjavaws.jar;C:Program FilesJavajdk1.7.0_71jrelibjce.jar;C:Program FilesJavajdk1.7.0_71jrelibjfr.jar;C:Program FilesJavajdk1.7.0_71jrelibjfxrt.jar;C:Program FilesJavajdk1.7.0_71jrelibjsse.jar;C:Program FilesJavajdk1.7.0_71jrelibmanagement-agent.jar;C:Program FilesJavajdk1.7.0_71jrelibplugin.jar;C:Program FilesJavajdk1.7.0_71jrelib
    esources.jar;C:Program FilesJavajdk1.7.0_71jrelib
    t.jar;D:workspace_testhello-worldoutproductionhello-world;C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3libidea_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+"
    _String2 value is : "+_String2);
            System.out.println("_String1 identityHashCode is :"+System.identityHashCode(_String1)+"
    _String2 identityHashCode is :"+System.identityHashCode(_String2));
            System.out.println("_String1==_String2 is : "+(_String1==_String2)+"
    ");
    
            String _String3 = new String("godtrue");
            String _String4 = new String("godtrue");
            System.out.println("_String3 value is : "+_String3+"
    _String4 value is : "+_String4);
            System.out.println("_String3 identityHashCode is :"+System.identityHashCode(_String3)+"
    _String4 identityHashCode is :"+System.identityHashCode(_String4));
            System.out.println("_String3==_String4 is : "+(_String3==_String4)+"
    ");
    
            String _String5 = _String1;
            String _String6 = _String1;
            System.out.println("_String5 value is : "+_String5+"
    _String6 value is : "+_String6);
            System.out.println("_String5 identityHashCode is :"+System.identityHashCode(_String5)+"
    _String6 identityHashCode is :"+System.identityHashCode(_String6));
            System.out.println("_String5==_String6 is : "+(_String5==_String6)+"
    ");
    
            String _String7 = _String3;
            String _String8 = _String3;
            System.out.println("_String7 value is : "+_String7+"
    _String8 value is : "+_String8);
            System.out.println("_String7 identityHashCode is :"+System.identityHashCode(_String7)+"
    _String8 identityHashCode is :"+System.identityHashCode(_String8));
            System.out.println("_String7==_String8 is : "+(_String7==_String8)+"
    ");
    
            String _String9 = _String1;
            String _String0 = _String3;
            System.out.println("_String9 value is : "+_String9+"
    _String0 value is : "+_String0);
            System.out.println("_String9 identityHashCode is :"+System.identityHashCode(_String9)+"
    _String0 identityHashCode is :"+System.identityHashCode(_String0));
            System.out.println("_String9==_String0 is : "+(_String9==_String0)+"
    ");
        }
    }

     上例运行的结果,如下所示(每次运行identityHashCode都不同的哟):

    "C:Program FilesJavajdk1.7.0_71injava" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.7.0_71jrelibcharsets.jar;C:Program FilesJavajdk1.7.0_71jrelibdeploy.jar;C:Program FilesJavajdk1.7.0_71jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.7.0_71jrelibextdnsns.jar;C:Program FilesJavajdk1.7.0_71jrelibextjaccess.jar;C:Program FilesJavajdk1.7.0_71jrelibextlocaledata.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunec.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunmscapi.jar;C:Program FilesJavajdk1.7.0_71jrelibextzipfs.jar;C:Program FilesJavajdk1.7.0_71jrelibjavaws.jar;C:Program FilesJavajdk1.7.0_71jrelibjce.jar;C:Program FilesJavajdk1.7.0_71jrelibjfr.jar;C:Program FilesJavajdk1.7.0_71jrelibjfxrt.jar;C:Program FilesJavajdk1.7.0_71jrelibjsse.jar;C:Program FilesJavajdk1.7.0_71jrelibmanagement-agent.jar;C:Program FilesJavajdk1.7.0_71jrelibplugin.jar;C:Program FilesJavajdk1.7.0_71jrelib
    esources.jar;C:Program FilesJavajdk1.7.0_71jrelib
    t.jar;D:workspace_testhello-worldoutproductionhello-world;C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3libidea_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+"
    int2 value is : "+int2);
            System.out.println("int1 identityHashCode is :"+System.identityHashCode(int1)+"
    int2 identityHashCode is :"+System.identityHashCode(int2));
            System.out.println("int1==int2 is : "+(int1==int2)+"
    ");
    
            Integer _Integer1 = 9;
            Integer _Integer2 = 9;
            System.out.println("_Integer1 value is : "+_Integer1+"
    _Integer2 value is : "+_Integer2);
            System.out.println("_Integer1 identityHashCode is :"+System.identityHashCode(_Integer1)+"
    _Integer2 identityHashCode is :"+System.identityHashCode(_Integer2));
            System.out.println("_Integer1==_Integer2 is : "+(_Integer1==_Integer2)+"
    ");
    
            Integer _Integer3 = new Integer(9);
            Integer _Integer4 = new Integer(9);
            System.out.println("_Integer3 value is : "+_Integer3+"
    _Integer4 value is : "+_Integer4);
            System.out.println("_Integer3 identityHashCode is :"+System.identityHashCode(_Integer3)+"
    _Integer4 identityHashCode is :"+System.identityHashCode(_Integer4));
            System.out.println("_Integer3==_Integer4 is : "+(_Integer3==_Integer4)+"
    ");
    
            Integer _Integer5 = int1;
            Integer _Integer6 = int1;
            System.out.println("_Integer5 value is : "+_Integer5+"
    _Integer6 value is : "+_Integer6);
            System.out.println("_Integer5 identityHashCode is :"+System.identityHashCode(_Integer5)+"
    _Integer6 identityHashCode is :"+System.identityHashCode(_Integer6));
            System.out.println("_Integer5==_Integer6 is : "+(_Integer5==_Integer6)+"
    ");
    
            Integer _Integer7 = _Integer1;
            Integer _Integer8 = _Integer1;
            System.out.println("_Integer7 value is : "+_Integer7+"
    _Integer8 value is : "+_Integer8);
            System.out.println("_Integer7 identityHashCode is :"+System.identityHashCode(_Integer7)+"
    _Integer8 identityHashCode is :"+System.identityHashCode(_Integer8));
            System.out.println("_Integer7==_Integer8 is : "+(_Integer7==_Integer8)+"
    ");
    
            Integer _Integer9 = _Integer3;
            Integer _Integer0 = _Integer3;
            System.out.println("_Integer9 value is : "+_Integer9+"
    _Integer0 value is : "+_Integer0);
            System.out.println("_Integer9 identityHashCode is :"+System.identityHashCode(_Integer9)+"
    _Integer0 identityHashCode is :"+System.identityHashCode(_Integer0));
            System.out.println("_Integer9==_Integer0 is : "+(_Integer9==_Integer0)+"
    ");
        }
    }

     上例运行的结果,如下所示(每次运行identityHashCode都不同的哟):

    "C:Program FilesJavajdk1.7.0_71injava" -Didea.launcher.port=7536 "-Didea.launcher.bin.path=C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.7.0_71jrelibcharsets.jar;C:Program FilesJavajdk1.7.0_71jrelibdeploy.jar;C:Program FilesJavajdk1.7.0_71jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.7.0_71jrelibextdnsns.jar;C:Program FilesJavajdk1.7.0_71jrelibextjaccess.jar;C:Program FilesJavajdk1.7.0_71jrelibextlocaledata.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunec.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.7.0_71jrelibextsunmscapi.jar;C:Program FilesJavajdk1.7.0_71jrelibextzipfs.jar;C:Program FilesJavajdk1.7.0_71jrelibjavaws.jar;C:Program FilesJavajdk1.7.0_71jrelibjce.jar;C:Program FilesJavajdk1.7.0_71jrelibjfr.jar;C:Program FilesJavajdk1.7.0_71jrelibjfxrt.jar;C:Program FilesJavajdk1.7.0_71jrelibjsse.jar;C:Program FilesJavajdk1.7.0_71jrelibmanagement-agent.jar;C:Program FilesJavajdk1.7.0_71jrelibplugin.jar;C:Program FilesJavajdk1.7.0_71jrelib
    esources.jar;C:Program FilesJavajdk1.7.0_71jrelib
    t.jar;D:workspace_testhello-worldoutproductionhello-world;C:Program Files (x86)JetBrainsIntelliJ IDEA 2016.1.3libidea_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和==

  • 相关阅读:
    HTML + CSS短标题(二,三,四文字长度)两端对齐的方式
    转载 ----MAC 上搭建lua
    转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)
    转载 ---资深HR告诉你:我如何筛选简历与选择人员的
    转载 OSX开发推荐书籍列表
    IOS --支付宝SDK 分解讲解
    IOS -RSA加密及解密
    ios --转载 使用SMSSDK实现短信验证:
    ios --转载 在mac上安装让rvm及cocoa pods详解
    简单说明Python中的装饰器的用法
  • 原文地址:https://www.cnblogs.com/godtrue/p/6375759.html
Copyright © 2011-2022 走看看