Android比较字符串是空的(isEmpty)

通常情况下,我们需要去推断一个字符串变量是否为空,今天,我特意做了一个小测试

StringUtils.java:

package com.yx.equipment_collection.utils;

import android.annotation.SuppressLint;
import android.text.TextUtils;
import android.util.Log;

/**
 * 
 * 此类描写叙述的是: String帮助类
 * 
 * @author: CS YX
 * @version:1.0
 * @date:2014-10-21 下午2:47:08
 */
public class StringUtils {
	private static final String TAG = "StringUtils";
	private static int count = 100000000;

	public static void checkEmpty1(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str == null || str.length() < 1) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty1 --- " + (end - start));
	}

	@SuppressLint("NewApi")
	public static void checkEmpty2(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str == null || str.isEmpty()) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty2 --- " + (end - start));
	}

	public static void checkEmpty3(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str == null || str == "") {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty3 --- " + (end - start));
	}

	public static void checkEmpty4(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str == null || str.equals("")) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty4 --- " + (end - start));

	}

	public static void checkEmpty5(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str == null || TextUtils.isEmpty(str)) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty5 --- " + (end - start));

	}

	public static void checkEmpty11(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str != null && str.length() > 0) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty11 --- " + (end - start));
	}

	@SuppressLint("NewApi")
	public static void checkEmpty22(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str != null && !str.isEmpty()) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty22 --- " + (end - start));
	}

	public static void checkEmpty33(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str != null && str != "") {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty33 --- " + (end - start));
	}

	public static void checkEmpty44(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str != null && !str.equals("")) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty44 --- " + (end - start));

	}

	public static void checkEmpty55(String str) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			if (str != null && !TextUtils.isEmpty(str)) {
			}
		}
		long end = System.currentTimeMillis();
		Log.i(TAG, "checkEmpty55 --- " + (end - start));

	}

}

測试为空例如以下:test

	public void test() {
		String str = "";
		Log.i("test", "str=\"\"---");
		StringUtils.checkEmpty1(str);
		StringUtils.checkEmpty2(str);
		StringUtils.checkEmpty3(str);
		StringUtils.checkEmpty4(str);
		StringUtils.checkEmpty5(str);
		str = null;
		Log.i("test", "str=null---");
		StringUtils.checkEmpty1(str);
		StringUtils.checkEmpty2(str);
		StringUtils.checkEmpty3(str);
		StringUtils.checkEmpty4(str);
		StringUtils.checkEmpty5(str);
		str = "null";
		Log.i("test", "str=\"null\"---");
		StringUtils.checkEmpty1(str);
		StringUtils.checkEmpty2(str);
		StringUtils.checkEmpty3(str);
		StringUtils.checkEmpty4(str);
		StringUtils.checkEmpty5(str);
		str = new String();
		Log.i("test", "str=new String()---");
		StringUtils.checkEmpty1(str);
		StringUtils.checkEmpty2(str);
		StringUtils.checkEmpty3(str);
		StringUtils.checkEmpty4(str);
		StringUtils.checkEmpty5(str);

	}

測试结果输入例如以下图:

由此图能够看出方法3(str == "")用时是最少的;其次就是方法1(str.length() < 1)和方法2(str.isEmpty()) ;

方法4(str.equals(""))耗时较多;方法5(TextUtils.isEmpty(str))最耗时

 測试非空例如以下:test

	public void test1() {
		String str = "";
		Log.i("test", "str=\"\"---");
		StringUtils.checkEmpty11(str);
		StringUtils.checkEmpty22(str);
		StringUtils.checkEmpty33(str);
		StringUtils.checkEmpty44(str);
		StringUtils.checkEmpty55(str);
		str = null;
		Log.i("test", "str=null---");
		StringUtils.checkEmpty11(str);
		StringUtils.checkEmpty22(str);
		StringUtils.checkEmpty33(str);
		StringUtils.checkEmpty44(str);
		StringUtils.checkEmpty55(str);
		str = "null";
		Log.i("test", "str=\"null\"---");
		StringUtils.checkEmpty11(str);
		StringUtils.checkEmpty22(str);
		StringUtils.checkEmpty33(str);
		StringUtils.checkEmpty44(str);
		StringUtils.checkEmpty55(str);
		str = new String();
		Log.i("test", "str=new String()---");
		StringUtils.checkEmpty11(str);
		StringUtils.checkEmpty22(str);
		StringUtils.checkEmpty33(str);
		StringUtils.checkEmpty44(str);
		StringUtils.checkEmpty55(str);
	}

測试结果例如以下图:

 

如上图所看到的,首先是方法33(str != null && str != "")比較占优势。方法11(str != null && str.length() > 0)和方法22(str != null && !str.isEmpty())整体来说。不相上下;

方法44(str != null && !str.equals(str != null && !TextUtils.isEmpty(str)))较耗时;方法55()还是最耗时


也有人说,用‘==’推断字符串不准确,应该用‘equals’,个人认为String一般都是直接=定义,想必没有几个人定义一个字符串会new出来吧。

为什么TextUtils.isEmpty()耗时最多,查看源代码原来isEmpty()已经推断了‘==null’:

    /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

源代码还用于.length()推断,假设你想‘==’不靠谱。推荐使用.length()对于推理方法!

不是单纯的个人意见......谢谢



posted @ 2015-12-10 20:19  blfshiye  阅读(168)  评论(0编辑  收藏  举报