/*對比s == null || s.equals("")
* s == null || s.length()<=0
* s == null || s.isEmpty()
*/
方法一: 最多人使用的一個方法, 直觀, 方便, 但效率很低.
方法二: 比較字串長度, 效率高, 是我知道的最好一個方法.
方法三: Java SE 6.0 才開始提供的方法, 效率和方法二幾乎相等, 但出於相容性考慮, 推薦使用方法二.
以下代碼在我機器上的運行結果: (機器效能不一, 僅供參考)
function 1 use time: 141ms
function 2 use time: 46ms
function 3 use time: 47ms
public class CompareStringNothing {
String s = "";
long n = 10000000;
private void function1() {
long startTime = System.currentTimeMillis();
for(long i = 0; i<n; i++) {
if(s == null || s.equals(""));
}
long endTime = System.currentTimeMillis();
System.out.println("function 1 use time: "+ (endTime - startTime) +"ms");
}
private void function2() {
long startTime = System.currentTimeMillis();
for(long i = 0; i< n; i++) {
if(s == null || s.length() <= 0);
}
long endTime = System.currentTimeMillis();
System.out.println("function 2 use time: "+ (endTime - startTime) +"ms");
}
private void function3() {
long startTime = System.currentTimeMillis();
for(long i = 0; i <n; i++) {
if(s == null || s.isEmpty());
}
long endTime = System.currentTimeMillis();
System.out.println("function 3 use time: "+ (endTime - startTime) +"ms");
}
public static void main(String[] args) {
CompareStringNothing com = new CompareStringNothing();
com.function1();
com.function2();
com.function3();
}
}
我使用的equals()、length()和JDK6之後的 isEmpty(),在效能上原文分析結果是equals()效能幾乎是length()的3.5倍,這個我不敢苟同,我實際測試的結果如下:
equals use time: 110ms
length use time: 78ms
還沒到2倍,於是乎我查看了String的源碼:
public int length() {
return count;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
通過源碼我很容易發現length()的效率要高於equals(),length()直接返回String對象的Count屬性,而equals()需要先進行判斷目標比對對象的類型,然後再進行其它操作,同時還要遍曆String對象的每一個char,查看是否相同。
同時原文提到的JDK6提供的String .isEmpty()方法我沒有安裝JDK6,所以只能替代行的查看了Commons-lang-2.6內StriingUtils的該方法,我相信JDK6的源碼與它應該是相同的,源碼如下:
public static boolean isEmpty(String str)
{
return (str == null) || (str.length() == 0);
}
可見isEmpty()同樣也使用了length()方法,呵呵~只能說apache不傻。
綜上我們可以清晰的得出三者效能上的優劣。equals() << length() / isEmpty()