zoukankan      html  css  js  c++  java
  • 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()对于推理方法!

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

    
    
  • 相关阅读:
    450. 删除二叉搜索树中的节点
    958. 二叉树的完全性检验
    5211. 概率最大的路径(197)
    5447. 石子游戏 IV
    174. 地下城游戏
    Codeforces Round #622 (Div. 2).C2
    Codeforces Round #624 (Div. 3) F. Moving Points 题解
    竞赛头
    离散化
    线段树
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5037193.html
Copyright © 2011-2022 走看看