當前位置: 妍妍網 > 碼農

不建議你用去a.equals(b)判斷是否相等!

2024-04-28碼農

一:值是null的情況

  1. a.equals(b) , a 是null, 丟擲 NullPointException 異常。

  2. a.equals(b) , a不是null, b是null, 返回false

  3. Objects.equals(a, b) 比較時, 若a 和 b 都是null, 則返回 true, 如果a 和 b 其中一個是null, 另一個不是null, 則返回false。註意:不會丟擲空指標異常。

null.equals("abc") → 丟擲 NullPointerException 異常
"abc".equals(null) → 返回 false
null.equals(null) → 丟擲 NullPointerException 異常
Objects.equals(null"abc") → 返回 false
Objects.equals("abc",null) → 返回 false
Objects.equals(nullnull) → 返回 true

二:值是空字串的情況

  1. a 和 b 如果都是空值字串:"", 則 a.equals(b), 返回的值是true, 如果a和b其中有一個不是空值字串,則返回false;

  2. 這種情況下 Objects.equals 與情況1 行為一致。

"abc".equals("") → 返回 false
"".equals("abc") → 返回 false
"".equals("") → 返回 true
Objects.equals("abc""") → 返回 false
Objects.equals("","abc") → 返回 false
Objects.equals("","") → 返回 true

三:源分碼析

源碼

publicfinal classObjects{
privateObjects(){
thrownew AssertionError("No java.util.Objects instances for you!");
}
/**
* Returns {@code true} if the arguments are equal to each other
* and {@code false} otherwise.
* Consequently, if both arguments are {@code null}, {@code true}
* is returned and if exactly one argument is {@code null}, {@code
* false} is returned. Otherwise, equality is determined by using
* the {@link Object#equals equals} method of the first
* argument.
*
@param a an object
@param b an object to be compared with {@code a} for equality
@return {@code true} if the arguments are equal to each other
* and {@code false} otherwise
@see Object#equals(Object)
*/

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

說明

首先,進行了物件地址的判斷,如果是真,則不再繼續判斷。

如果不相等,後面的運算式的意思是,先判斷a不為空,然後根據上面的知識點,就不會再出現空指標。

所以,如果都是null,在第一個判斷上就為true了。如果不為空,地址不同,就重要的是判斷a.equals(b)。

來源:cnblogs.com/juncaoit

>>

END

精品資料,超贊福利,免費領

微信掃碼/長按辨識 添加【技術交流群

群內每天分享精品學習資料

最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎並行JVMMySQLRedisSpringSpringMVCSpringBootSpringCloud訊息佇列等多個型別),歡迎您的使用。

👇👇

👇點選"閱讀原文",獲取更多資料(持續更新中