您的位置:首页 > 编程语言 > Java开发

Java 判断字符串是否为空的三种方法与性能分析

2011-09-04 09:35 453 查看
 

Java 判断字符串是否为空的三种方法与性能分析

Java编程过程中经常会涉及到判断空字符串的问题,对于我而言经常使用的是equals()方法,代码如下:

if(target != null && !"".equals(target)){

      System.out.println("target字符串不为空");

}

碰巧昨天见到一篇关于判断Java空字符串三种方法的比较,突然觉得自己在平时里做的还不够深入,没有对代码的性能进行极致优化,自己要反思与提高。

原文提到的三种方法分别是:我使用的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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息