µ±Ç°Î»Öà ²©ÎÄÊ×Ò³ > ³ÁĬÍõ¶þ£º½ÌÃÃѧ Java£º ÈçºÎ±È½ÏÁ½¸ö×Ö·û´®ÏàµÈ

    ³ÁĬÍõ¶þ£º½ÌÃÃѧ Java£º ÈçºÎ±È½ÏÁ½¸ö×Ö·û´®ÏàµÈ

    ×÷Õߣº[db:×÷Õß] ʱ¼ä£º2021-07-13 16:04

    ¡°¸ç,ÈçºÎ±È½ÏÁ½¸ö×Ö·û´®ÏàµÈ°¡?¡±ÈýÃÃÎÊ¡£

    ¡°Õâ¸öÎÊÌâ¿´ËƼòµ¥,È´ÔÚ Stack Overflow ÉÏÓг¬¹ý 370 ÍòµÄ·ÃÎÊÁ¿¡£¡±ÎÒ˵,¡°Õâ¸öÎÊÌâÒ²¿ÉÒÔÒýÉêΪ .equals() ºÍ ¡®==¡¯ ²Ù×÷·ûÓÐʲôÇø±ð¡£¡±

    • ¡°==¡±²Ù×÷·ûÓÃÓڱȽÏÁ½¸ö¶ÔÏóµÄµØÖ·ÊÇ·ñÏàµÈ¡£
    • .equals() ·½·¨ÓÃÓڱȽÏÁ½¸ö¶ÔÏóµÄÄÚÈÝÊÇ·ñÏàµÈ¡£

    ¡°²»ÊǺÜÀí½â¡£¡±ÈýÃøе½ºÜÀ§»ó¡£

    ¡°ÎÒÀ´¾Ù¸ö²»Ç¡µ±ÓÖºÜÇ¡µ±µÄÀý×Ó,Ò»¿´Äã¾ÍÃ÷°×ÁË,ÈýÃᣡ±

    ÓÐÒ»¶ÔË«°ûÌ¥,½ã½ã½Ð°¢ÀöËþ,ÃÃÃýÐÂåÀöËþ¡£ÎÒÃÇÆÕͨÈË¿ÉÄÜÍêÈ«ÎÞ·¨·Ö±æË­Êǽã½ãË­ÊÇÃÃÃÃ,¿ÉËýÃǵÄÂèÂèÈ´¿ÉÒÔÇá¶øÒ׾ٵرæÈϳö¡£

    .equals() ¾ÍºÃÏñÎÒÃÇÆÕͨÈË,¿´¼û°¢ÀöËþÒÔΪÊÇÂåÀöËþ,¿´¼ûÂåÀöËþÒÔΪÊÇ°¢ÀöËþ,¿´ÆðÀ´Ò»Ñù¾Í¾õµÃËýÃÇÊÇͬһ¸öÈË;¡°==¡±²Ù×÷·û¾ÍºÃÏñËýÃǵÄÂèÂè,ÒªÇó¸üÑϸñ,¹Û²ì¸üϸÖÂ,Ò»ÑÛ¾ÍÄÜ·Ö±æ³öË­Êǽã½ãË­ÊÇÃÃÃá£

    String alita = new String("СÂÜÀò");
    String luolita = new String("СÂÜÀò");
    
    System.out.println(alita.equals(luolita)); // true
    System.out.println(alita == luolita); // false
    

    ¾ÍÉÏÃæÕâ¶Î´úÂëÀ´Ëµ,.equals() Êä³öµÄ½á¹ûΪ true,¶ø¡°==¡±²Ù×÷·ûÊä³öµÄ½á¹ûΪ false¡ª¡ªÇ°ÕßÒªÇóÄÚÈÝÏàµÈ¾Í¿ÉÒÔ,ºóÕßÒªÇó±ØÐëÊÇͬһ¸ö¶ÔÏó¡£

    ¡°ÈýÃÃ,֮ǰÒѾ­Ñ§¹ýÁË,Java µÄËùÓÐÀ඼ĬÈϵؼ̳РObject Õâ¸ö³¬Àà,¸ÃÀàÓÐÒ»¸öÃûΪ .equals() µÄ·½·¨¡£¡±Ò»±ß˵,ÎÒÒ»±ß´ò¿ªÁË Object ÀàµÄÔ´Âë¡£

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

    Äã¿´,Object ÀàµÄ .equals() ·½·¨Ä¬ÈϲÉÓõÄÊÇ¡°¡±²Ù×÷·û½øÐбȽϡ£¼ÙÈç×ÓÀàûÓÐÖØд¸Ã·½·¨µÄ»°,ÄÇô¡°¡±²Ù×÷·ûºÍ .equals() ·½·¨µÄ¹¦Ð§¾ÍÍêÈ«Ò»Ñù¡ª¡ª±È½ÏÁ½¸ö¶ÔÏóµÄÄÚ´æµØÖ·ÊÇ·ñÏàµÈ¡£

    µ«Êµ¼ÊÇé¿öÖÐ,Óв»ÉÙÀàÖØдÁË .equals() ·½·¨,ÒòΪ±È½ÏÄÚ´æµØÖ·µÄÒªÇó±È½ÏÑϸñ,²»Ì«·ûºÏÏÖʵÖÐËùÓеij¡¾°ÐèÇó¡£Äà String ÀàÀ´Ëµ,ÎÒÃÇÔڱȽÏ×Ö·û´®µÄʱºò,µÄÈ·Ö»ÏëÅжÏËüÃÇÁ©µÄÄÚÈÝÊÇÏàµÈµÄ¾Í¿ÉÒÔÁË,²¢²»Ïë±È½ÏËüÃÇÁ©ÊDz»ÊÇͬһ¸ö¶ÔÏó¡£

    ¿öÇÒ,×Ö·û´®ÓÐ×Ö·û´®³£Á¿³ØµÄ¸ÅÄî,±¾Éí¾ÍÍƼöʹÓà String s = "×Ö·û´®" ÕâÖÖÐÎʽÀ´´´½¨×Ö·û´®¶ÔÏó,¶ø²»ÊÇͨ¹ý new ¹Ø¼ü×ֵķ½Ê½,ÒòΪ¿ÉÒÔ°Ñ×Ö·û´®»º´æÔÚ×Ö·û´®³£Á¿³ØÖÐ,·½±ãÏ´ÎʹÓá£

    ¡°Å¶,ÎÒÃ÷°×ÁË¡£¡±ÈýÃÃ˵¡£

    ¡°ÄǾÍÀ´¿´Ò»Ï .equals() ·½·¨µÄÔ´Âë°É¡£¡±ÎÒ˵¡£

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                        : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }
    

    Ê×ÏÈ,Èç¹ûÁ½¸ö×Ö·û´®¶ÔÏóµÄ¿ÉÒÔ¡°==¡±,ÄǾÍÖ±½Ó·µ»Ø true ÁË,ÒòΪÕâÖÖÇé¿öÏÂ,×Ö·û´®ÄÚÈÝÊDZØÈ»ÏàµÈµÄ¡£·ñÔò¾Í°´ÕÕ×Ö·û±àÂë½øÐбȽÏ,·ÖΪ UTF16 ºÍ Latin1,²î±ð²»ÊǺܴó,¾ÍÄà Latin1 µÄÀ´Ëµ°É¡£

    @HotSpotIntrinsicCandidate
    public static boolean equals(byte[] value, byte[] other) {
        if (value.length == other.length) {
            for (int i = 0; i < value.length; i++) {
                if (value[i] != other[i]) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
    

    ÎÒµÄ JDK °æ±¾ÊÇ Java 11,Ò²¾ÍÊÇ×îÐ嵀 LTS(³¤ÆÚÖ§³Ö)°æ±¾¡£¸Ã°æ±¾ÖÐ,String ÀàʹÓÃ×Ö½ÚÊý×éʵÏÖµÄ,ËùÒԱȽÏÁ½¸ö×Ö·û´®µÄÄÚÈÝÊÇ·ñÏàµÈʱ,¿ÉÒÔÏȱȽÏ×Ö½ÚÊý×éµÄ³¤¶ÈÊÇ·ñÏàµÈ,²»ÏàµÈ¾ÍÖ±½Ó·µ»Ø false;·ñÔò¾Í±éÀúÁ½¸ö×Ö·û´®µÄ×Ö½ÚÊý×é,Ö»ÓÐÓÐÒ»¸ö×Ö½Ú²»ÏàµÈ,¾Í·µ»Ø false¡£

    ¡°àÅ,¶þ¸ç,Õâ¶ÎÔ´Âë²»ÄÑÀí½â¡£¡±ÈýÃÃ×ÔÐŵØ˵¡£

    ¡°Ädzö¼¸µÀÌ⿼¿¼Äã°É!¡±ÎÒ˵¡£

    µÚÒ»Ìâ:

    new String("СÂÜÀò").equals("СÂÜÀò")
    

    ¡°Êä³öʲôÄØ?¡±ÎÒÎÊ¡£

    ¡°.equals() ±È½ÏµÄÊÇÁ½¸ö×Ö·û´®¶ÔÏóµÄÄÚÈÝÊÇ·ñÏàµÈ,ËùÒÔ½á¹ûΪ true¡£¡±ÈýÃôð¡£

    µÚ¶þÌâ:

    new String("СÂÜÀò") == "СÂÜÀò"
    

    ¡°==²Ù×÷·û×ó²àµÄÊÇÔÚ¶ÑÖд´½¨µÄ¶ÔÏó,ÓÒ²àÊÇÔÚ×Ö·û´®³£Á¿³ØÖеĶÔÏó,¾¡¹ÜÄÚÈÝÏàͬ,µ«ÄÚ´æµØÖ·²»Í¬,ËùÒÔ·µ»Ø false¡£¡±ÈýÃôð¡£

    µÚÈýÌâ:

    new String("СÂÜÀò") == new String("СÂÜÀò")
    

    ¡°new ³öÀ´µÄ¶ÔÏó¿Ï¶¨ÊÇÍêÈ«²»Í¬µÄÄÚ´æµØÖ·,ËùÒÔ·µ»Ø false¡£¡±ÈýÃôð¡£

    µÚËÄÌâ:

    "СÂÜÀò" == "СÂÜÀò"
    

    ¡°×Ö·û´®³£Á¿³ØÖÐÖ»»áÓÐÒ»¸öÏàͬÄÚÈݵĶÔÏó,ËùÒÔ·µ»Ø true¡£¡±ÈýÃôð¡£

    µÚÎåÌâ:

    "СÂÜÀò" == "С" + "ÂÜÀò"
    

    ¡°ÓÉÓÚ¡®Ð¡¡¯ºÍ¡®ÂÜÀò¡¯¶¼ÔÚ×Ö·û´®³£Á¿³Ø,ËùÒÔ±àÒëÆ÷ÔÚÓöµ½¡®+¡¯²Ù×÷·ûµÄʱºò½«Æä×Ô¶¯ÓÅ»¯Îª¡°Ð¡ÂÜÀò¡±,ËùÒÔ·µ»Ø true¡£¡±

    µÚÁùÌâ:

    new String("СÂÜÀò").intern() == "СÂÜÀò"
    

    ¡°new String("СÂÜÀò") ÔÚÖ´ÐеÄʱºò,»áÏÈÔÚ×Ö·û´®³£Á¿³ØÖд´½¨¶ÔÏó,È»ºóÔÙÔÚ¶ÑÖд´½¨¶ÔÏó;Ö´ÐÐ intern() ·½·¨µÄʱºò·¢ÏÖ×Ö·û´®³£Á¿³ØÖÐÒѾ­ÓÐÁË¡®Ð¡ÂÜÀò¡¯Õâ¸ö¶ÔÏó,ËùÒÔ¾ÍÖ±½Ó·µ»Ø×Ö·û´®³£Á¿³ØÖеĶÔÏóÒýÓÃÁË,ÄÇÔÙÓë×Ö·û´®³£Á¿³ØÖеġ®Ð¡ÂÜÀò¡¯±È½Ï,µ±È»»á·µ»Ø true ÁË¡£¡±ÈýÃÃ˵¡£

    ÍÛ,²»µÃ²»Ëµ,ÈýÃÃÇ°¼¸½ÚµÄ×Ö·û´®Ïà¹ØÄÚÈݶ¼Íêȫѧ»áÁËѽ!

    ¡°ÈýÃÃ,¸çÔÙ¸øÄã²¹³äÒ»µã¡£¡±ÎÒ˵¡£

    ¡°Èç¹ûÒª½øÐÐÁ½¸ö×Ö·û´®¶ÔÏóµÄÄÚÈݱȽÏ,³ýÁË .equals() ·½·¨,»¹ÓÐÆäËûÁ½¸ö¿ÉÑ¡µÄ·½°¸¡£¡±

    1)Objects.equals()

    Objects.equals() Õâ¸ö¾²Ì¬·½·¨µÄÓÅÊÆÔÚÓÚ²»ÐèÒªÔÚµ÷ÓÃ֮ǰÅпա£

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
    

    Èç¹ûÖ±½ÓʹÓà a.equals(b),ÔòÐèÒªÔÚµ÷ÓÃ֮ǰ¶Ô a ½øÐÐÅпÕ,·ñÔò¿ÉÄÜ»áÅ׳ö¿ÕÖ¸Õë java.lang.NullPointerException¡£Objects.equals() ÓÃÆðÀ´¾ÍÍêȫûÓÐÕâ¸öµ£ÐÄ¡£

    Objects.equals("СÂÜÀò", new String("С" + "ÂÜÀò")) // --> true
    Objects.equals(null, new String("С" + "ÂÜÀò")); // --> false
    Objects.equals(null, null) // --> true
    
    String a = null;
    a.equals(new String("С" + "ÂÜÀò")); // throw exception
    

    2)String ÀàµÄ .contentEquals()

    .contentEquals() µÄÓÅÊÆÔÚÓÚ¿ÉÒÔ½«×Ö·û´®ÓëÈκεÄ×Ö·ûÐòÁÐ(StringBuffer¡¢StringBuilder¡¢String¡¢CharSequence)½øÐбȽϡ£

    public boolean contentEquals(CharSequence cs) {
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            if (cs instanceof StringBuffer) {
                synchronized(cs) {
                    return nonSyncContentEquals((AbstractStringBuilder)cs);
                }
            } else {
                return nonSyncContentEquals((AbstractStringBuilder)cs);
            }
        }
        // Argument is a String
        if (cs instanceof String) {
            return equals(cs);
        }
        // Argument is a generic CharSequence
        int n = cs.length();
        if (n != length()) {
            return false;
        }
        byte[] val = this.value;
        if (isLatin1()) {
            for (int i = 0; i < n; i++) {
                if ((val[i] & 0xff) != cs.charAt(i)) {
                    return false;
                }
            }
        } else {
            if (!StringUTF16.contentEquals(val, cs, n)) {
                return false;
            }
        }
        return true;
    }
    

    ´ÓÔ´ÂëÉÏ¿ÉÒÔ¿´µÃ³ö,Èç¹û cs ÊÇ StringBuffer,¸Ã·½·¨»¹»á½øÐÐͬ²½,·Ç³£µÄÖÇÄÜ»¯;Èç¹ûÊÇ String µÄ»°,Æäʵµ÷ÓõĻ¹ÊÇ equals() ·½·¨¡£µ±È»ÁË,ÕâÒ²¾ÍÒâζ×ÅʹÓø÷½·¨½øÐбȽϵÄʱºò,¶à³öÀ´Á˺ܶಽÖè,ÐÔÄÜÉÏÓÐЩËðʧ¡£

    ¡°ÊǵÄ,×ÜÌåÉϸоõ»¹ÊÇ Objects.equals() ±È½ÏÊæ·þ¡£¡±ÈýÃõÄÑÛ¾¦ÊÇÑ©ÁÁµÄ,·¢ÏÖÁËÕâ¸ö·½·¨µÄÓŵ㡣


    Ô´Âë:https://github.com/itwanger/Tech-Sister-Learn-Java

    cs
    ÏÂһƪ£ºÃ»ÓÐÁË