在項目裏面我們經常用到這樣一句代碼:
//這裏我對 s 直接局部賦值了哈,就不從對象或者是其他地方去讀取了.
String s = "測試";
//假設現在的需求就是對 s 做非空判斷,當它不爲空的時候就設置到TextView上去顯示
if(null != s && !"".equals(s)){
tv.setText(s);
}
//請不要在意我上面的顯示邏輯
請看上面的判斷,先判斷 不等於null是沒問題的,然後再判斷是否爲空字符串,代碼走到這裏的時候就已經知道這個對象不是null了,可以直接用s.length() != 0 來替代 "".equals(s)了,因爲equals 源碼如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = length();
if (n == anotherString.length()) {
int i = 0;
while (n-- != 0) {
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
我們直接看 int n = length(); 和下面那句,就是對兩個對象(如果你做的是非空字符串判斷),按照"",equals(s); 的話,this 就是空字符串,anObject 就是傳進來的s ,然後先做 this == anObject 判斷,然後再做 anObject instanceof 判斷,然後又走到了長度校驗等等一些操作。
試問,如果我們知道這個對象不是null,爲什麼不直接用 s.length() != 0 來判斷這個字符串是否爲空呢?反而用equals,我自己在代碼裏面做非空校驗的時候也是喜歡用equals,但是其實在不爲null的基礎上s.length() !=0 更加直接高效,所以我建議我自己喝大家以後做類似操作的時候,儘量寫錯下面這樣:
if(null != s && s.length() !=0 ){
tv.setText(s);
}
雖然在效率上沒有什麼很大的提升,但是資源能節約一點是一點,關鍵是,我們要知道這個事實。