equals變數在前面和後面的區別
阿新 • • 發佈:2019-02-07
我就不廢話那麼多,直接上程式碼:
package sf.com.mainTest; public class Test { public static void main(String[] args) { System.out.println(new Test().isBool(null)); } public boolean isBool(String a){ return a.equals("true"); // return "null".equals(a); } }
如上述程式碼:a.equals("true");和"null".equals(a);有什麼區別的?
答案:前者會拋空指標異常,後者不會;
剖析:如果a=null,String物件就會是一個空物件,空物件說明沒有equals方法,所以就會報空指標異常;
又如,後者a=null,"null".equals(a);結果永遠都為false,原因直接看原始碼:
public boolean equals(Object anObject) { if (this == anObject) { return true; }
//判斷anObject是否為String型別 if (anObject instanceof String) { String anotherString= (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i])return false; i++; } return true; } } return false; }
為了避免這個坑點,還是使用另外一種方式吧!
使用org.apache.commons.lang包下的StringUtils.equals(String str1, String str2)方法
直接看原始碼:
public static boolean equals(String str1, String str2) { return str1 != null ? str1.equals(str2) : str2 == null; } //忽略大小寫進行比較 public static boolean equalsIgnoreCase(String str1, String str2) { return str1 != null ? str1.equalsIgnoreCase(str2) : str2 == null; }
看到StringUtils.equals這個方法了吧。他已經幫你繞過了那個坑,我還是比較推薦大家多用用StringUtils工具類裡面的方法,
畢竟是人家封裝好的,可以直接拿來用,儘量少走彎路