µ±Ç°Î»Öà ²©ÎÄÊ×Ò³ > ³ÁĬÍõ¶þ£º½ÌÃÃѧ Java£º ÈçºÎ±È½ÏÁ½¸ö×Ö·û´®ÏàµÈ
¡°¸ç,ÈçºÎ±È½ÏÁ½¸ö×Ö·û´®ÏàµÈ°¡?¡±ÈýÃÃÎÊ¡£
¡°Õâ¸öÎÊÌâ¿´ËƼòµ¥,È´ÔÚ 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