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;
}
来源:oschina
链接:https://my.oschina.net/u/1866370/blog/717407