StringUtils.java解析【持续更新】

无人久伴 提交于 2019-12-07 03:35:36

StringUtils工具类在org.apache.commons.lang.StringUtils包下,下面我将在源码的基础上做笔记一样一点一点读下去,解析下去。

package org.apache.commons.lang;

import java.util.*;

// Referenced classes of package org.apache.commons.lang:
//            ArrayUtils, ObjectUtils, CharSetUtils, StringEscapeUtils, 
//            WordUtils, CharUtils

public class StringUtils
{

    public static final String EMPTY = "";
    public static final int INDEX_NOT_FOUND = -1;
    private static final int PAD_LIMIT = 8192;

    public StringUtils()
    {
    }
    
    /**
    *Java中获取长度的对应方法。
    *如果是数组的话就是:数组.length属性;
    *如果是字符串的话就是:字符串.length()方法;
    *如果是集合的话就是:集合.size()方法
    */
    
    //判断字符串为不为空,等于null或者长度为0,注意:空格字符不为空
    public static boolean isEmpty(String str)
    {
        return str == null || str.length() == 0;
    }


    //判断字符串不为空,不等于null并且长度不为0,即 str != null && str.length() != 0
    public static boolean isNotEmpty(String str)
    {
        return !isEmpty(str);
    }


//isEmpty方法和isBlank方法,两个都是判断字符串为不为空的,但是isEmpty方法中:WhiteSpace会定为非空,而isBlank方法会定为空。
    public static boolean isBlank(String str)
    {
        int strLen;
        if (str == null || (strLen = str.length()) == 0)
            return true;
        for (int i = 0; i < strLen; i++)
            if (!Character.isWhitespace(str.charAt(i)))
                return false;

        return true;
    }

    public static boolean isNotBlank(String str)
    {
        return !isBlank(str);
    }

    /**
     * @deprecated Method clean is deprecated
     * clean方法被弃用了
     */

    public static String clean(String str)
    {
        return str != null ? str.trim() : "";
    }

//下面介绍到StringUtils类中的第一个拦路虎trim(),当时我看的时候也是百思不得其解,在网上找了很多资料,稍微了解了一下其中的原理,搞的稍微明白了一些。

比较靠谱的讲解:

http://blog.csdn.net/muyu114/article/details/5734295

trim()方法在StringUtils中没有,这个类是在String文件中才有的,下面从String类中将其摘出。

string类的trim()方法
        public String trim() { //用一个很形象的说法就是:trim()是去掉一个字符串两端的控制符不仅仅是空格
        int len = value.length; //字符数组的长度
        int st = 0; //字符串中不为空格的第一个字符位置,即字符串中不为空格的字符的起始位置
        char[] val = value;    

        while ((st < len) && (val[st] <= ' ')) { //字母的转义字符都大于空格的转义字符
            st++;
        }
        while ((st < len) && (val[len - 1] <= ' ')) { //字母的转义字符都大于空格的转义字符
            len--; //字符串中从右边数不为空格的第一个字符的位置,即字符串中不为空格的字符的结束位置
        }
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this; //判断是否有空格需要截取,有则截取,没有则返回原String
    }

下面是trim()函数在源码中的注释翻译过来的。

\u0020在Unicode编码中对应的是空格,\r \n都是小于\u0020。
'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。
trim 也就是去掉最开始和最开头的空白字符
public String trim()
返回字符串的副本,忽略前导空白和尾部空白。
如果此 String 对象表示一个空字符序列,或者此 String 对象表示的字符序列的第一个和最后一个字符的代码都大于 '\u0020'(空格字符),则返回对此 String 对象的引用。

否则,若字符串中没有代码大于 '\u0020' 的字符,则创建并返回一个表示空字符串的新 String 对象。

否则,假定 k 为字符串中代码大于 '\u0020' 的第一个字符的索引,m 为字符串中代码大于 '\u0020' 的最后一个字符的索引。创建一个新的 String 对象,它表示此字符串中从索引 k 处的字符开始,到索引 m 处的字符结束的子字符串,即 this.substring(k, m+1) 的结果。

此方法可用于截去字符串开头和末尾的空白(如上所述)。

返回:
此字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串。

public static String trim(String str)
    {
        return str != null ? str.trim() : null;
    }

    //trimToNull 判断trim后的字符串是不是Empty 是的话返回null 不是的话就返回ts
    public static String trimToNull(String str)
    {
        String ts = trim(str);
        return isEmpty(ts) ? null : ts;
    }


    //trimToEmpty 判断字符串等于不等于null 不等于返回trim后的字符串 等于就返回""空字符串
    public static String trimToEmpty(String str)
    {
        return str != null ? str.trim() : "";
    }

//去掉字符串两端的空白符,如果输入为null,则返回null
    public static String strip(String str)
    {
        return strip(str, null);
    }
    //去掉字符串两端空白符(WhiteSpace),如果字符串是null则返回null,不是null,则返回strip(str, null)去掉两端空白符
    public static String stripToNull(String str)
    {
        if (str == null)
        {
            return null;
        } else
        {
            str = strip(str, null);
            return str.length() != 0 ? str : null;
        }
    }
    //去掉字符串两端的空白符,如果字符串等于null则返回""空字符串,否则返回strip(str,null)去掉两端空白符
    public static String stripToEmpty(String str)
    {
        return str != null ? strip(str, null) : "";
    }
    //去掉str两端的在stripChars中的字符。
    //在这个函数中先进行stripStart,然后再进行stripEnd,就是先去掉字符串前端的在stripChars中的字符,然后去掉字符串末端的在stripChars中的字符
    /**
    *一个例子
    * String str = "abcde";
    * 【1】String stripChars = "ace";
    * StringUtils.strip(str, stripChars) = "bcd";
    * 【2】String stripChars = "abd"
    * StringUtils.strip(str, stripChars) = "cde"
    */
    public static String strip(String str, String stripChars)
    {
        if (isEmpty(str))
        {
            return str;
        } else
        {
            str = stripStart(str, stripChars);
            return stripEnd(str, stripChars);
        }
    }
    //去掉str前端的在stripChars中的字符。
    public static String stripStart(String str, String stripChars)
    {
        int strLen;
        //如果str == null 或者长度为0,则返回str
        if (str == null || (strLen = str.length()) == 0)
            return str;
        int start = 0;
        if (stripChars == null)
        {
            for (; start != strLen && Character.isWhitespace(str.charAt(start)); start++);
            //如果stripChars == null,start 记录str中第一个不为空白字符的字符的位置
        } else
        {
            if (stripChars.length() == 0)
                return str;
            for (; start != strLen && stripChars.indexOf(str.charAt(start)) != -1; start++);
            //如果stripChars != null,则start记录str的前端不与stripChars前端字符一样的第一个字符的位置
        }
        return str.substring(start);
    }
    //去掉str末端的在stripChars中的字符
    public static String stripEnd(String str, String stripChars)
    {
        //参考stripStart()函数
        int end;
        if (str == null || (end = str.length()) == 0)
            return str;
        if (stripChars == null)
        {
            for (; end != 0 && Character.isWhitespace(str.charAt(end - 1)); end--);
        } else
        {
            if (stripChars.length() == 0)
                return str;
            for (; end != 0 && stripChars.indexOf(str.charAt(end - 1)) != -1; end--);
        }
        return str.substring(0, end);
    }

    //去掉String数组strs[]前后两端的空格
    public static String[] stripAll(String strs[])
    {
        return stripAll(strs, null);
    }
    //去掉String数组strs[]前后两端与stripChars一样的字符
    public static String[] stripAll(String strs[], String stripChars)
    {
        int strsLen;
        if (strs == null || (strsLen = strs.length) == 0)
            return strs;
        String newArr[] = new String[strsLen];
        for (int i = 0; i < strsLen; i++)
            newArr[i] = strip(strs[i], stripChars);

        return newArr;
    }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!