博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java 判断字符串是否为空的三种方法.

Posted on 2012-12-10 09:40  小往  阅读(1486)  评论(0编辑  收藏  举报

/*对比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()