StringUtils常用方法概览
StringUtils
是 Apache Commons Lang 库中的一个非常有用的工具类,它提供了许多操作 String
的静态方法。使用 StringUtils
可以使字符串操作更加简便和高效。以下是一些 StringUtils
中常用的方法:
- isEmpty() 和 isNotEmpty():
isEmpty(String str)
: 检查一个字符串是否为空(null
或长度为 0)。isNotEmpty(String str)
: 检查一个字符串是否不为空。
- isBlank() 和 isNotBlank():
isBlank(String str)
: 检查一个字符串是否为空白(null
、空或仅包含空白字符)。isNotBlank(String str)
: 检查一个字符串是否不为空白。
- trim() 和 strip():
trim(String str)
: 去除字符串两端的空白字符。strip(String str, String stripChars)
: 去除字符串两端指定的字符。
- equals() 和 equalsIgnoreCase():
equals(String str1, String str2)
: 比较两个字符串是否相等,处理null
值。equalsIgnoreCase(String str1, String str2)
: 比较两个字符串是否相等,不区分大小写,同时处理null
值。
- join() 和 split():
join(Object[] array, String separator)
: 使用指定的分隔符将数组元素连接成一个字符串。join(Iterable<?> iterable, String separator)
: 使用指定的分隔符将可迭代对象的元素连接成一个字符串。split(String str, String separatorChars)
: 根据指定的分隔符字符集将字符串拆分为数组。
- substring() 和 left() / right():
substring(String str, int start)
: 获取字符串从指定位置开始的子字符串。substring(String str, int start, int end)
: 获取字符串从起始位置到结束位置的子字符串。left(String str, int len)
: 获取字符串最左边的指定长度的子字符串。right(String str, int len)
: 获取字符串最右边的指定长度的子字符串。
- contains() 和 containsIgnoreCase():
contains(String str, CharSequence seq)
: 检查一个字符串是否包含另一个字符序列。containsIgnoreCase(String str, CharSequence seq)
: 检查一个字符串是否包含另一个字符序列,不区分大小写。
- replace() 和 overlay():
replace(String text, String searchString, String replacement)
: 替换字符串中所有出现的指定子字符串。overlay(String str, String overlay, int start, int end)
: 用新的字符串覆盖原始字符串的指定部分。
- capitalize() 和 uncapitalize():
capitalize(String str)
: 将字符串的首字母变为大写。uncapitalize(String str)
: 将字符串的首字母变为小写。
- remove() 和 delete():
remove(String str, char remove)
: 移除字符串中所有出现的指定字符。deleteWhitespace(String str)
: 删除字符串中的所有空白字符。
这只是 StringUtils
类提供的方法的一小部分。在实际开发中,这个类可以大大简化字符串的操作和处理。
下面,使用几个StringUtils类的方法练习一下!
① 判断字符串是否为空
常用的判断字符串为空的方法:
- isEmpty():检查一个字符串是否为空(
null
或长度为 0)。 - isBlank(): 检查一个字符串是否为空白(
null
、空或仅包含空白字符)。 - isNotEmpty():检查一个字符串是否不为空。
- isNotBlank():检查一个字符串是否不为空白。
查看一下isEmpty()和isBlank()的源码:
// isEmpty
public static boolean isEmpty(CharSequence cs) {
return cs == null || cs.length() == 0;
}
// isBlank
public static boolean isBlank(CharSequence cs) {
int strLen = length(cs);
if (strLen == 0) {
return true;
} else {
for(int i = 0; i < strLen; ++i) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
}
② 分隔字符串
String类的split()方法可以完成字符串切片分割的功能,但是相较于StringUtils类中的split()方法较为不安全,如下面的代码
// 分隔字符串
String strToSplit = null;
String[] split1 = strToSplit.split(strToSplit); // 抛异常 java.lang.NullPointerException
// StringUtils 更为安全,当传入的字符串为空时,不会抛异常
String[] split2 = StringUtils.split(strToSplit);
System.out.println(Arrays.toString(split2)); // null
StringUtils.split()的源码,其实最核心的方法,应该是splitWorker(),splitWorker()方法中完成了字符串切割的字符串检验,字符串切片。
public static String[] split(String str) {
return split(str, (String)null, -1);
}
public static String[] split(String str, String separatorChars, int max) {
return splitWorker(str, separatorChars, max, false);
}
private static String[] splitWorker(String str, String separatorChars, int max, boolean preserveAllTokens) {
if (str == null) {
return null;
} else {
int len = str.length();
if (len == 0) {
return ArrayUtils.EMPTY_STRING_ARRAY;
} else {
List<String> list = new ArrayList();
int sizePlus1 = 1;
int i = 0;
int start = 0;
boolean match = false;
boolean lastMatch = false;
if (separatorChars != null) {
if (separatorChars.length() != 1) {
label87:
while(true) {
while(true) {
if (i >= len) {
break label87;
}
if (separatorChars.indexOf(str.charAt(i)) >= 0) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
++i;
start = i;
} else {
lastMatch = false;
match = true;
++i;
}
}
}
} else {
char sep = separatorChars.charAt(0);
label71:
while(true) {
while(true) {
if (i >= len) {
break label71;
}
if (str.charAt(i) == sep) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
++i;
start = i;
} else {
lastMatch = false;
match = true;
++i;
}
}
}
}
} else {
label103:
while(true) {
while(true) {
if (i >= len) {
break label103;
}
if (Character.isWhitespace(str.charAt(i))) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
++i;
start = i;
} else {
lastMatch = false;
match = true;
++i;
}
}
}
}
if (match || preserveAllTokens && lastMatch) {
list.add(str.substring(start, i));
}
return (String[])list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
}
}
③ 判断字符串是否为纯数字的字符串
StringUtils.isNumeric()方法,可以更方便的判断当前的字符串是否是一个纯数字的字符串。
StringUtils.isNumericSpace() 方法,可以判断含有空格的数字字符串。
String strNum1 = "123";
String strNum2 = "123.45";
String strNum3 = "123f";
String strNum4 = "123q";
// 判断是否为纯数字字符串
System.out.println(StringUtils.isNumeric(strNum1)); // true
System.out.println(StringUtils.isNumeric(strNum2)); // false
System.out.println(StringUtils.isNumeric(strNum3)); // false
System.out.println(StringUtils.isNumeric(strNum4)); // false
// isNumericSpace() 方法,可以判断含有空格的数字字符串
String strNum5 = "12 3";
System.out.println(StringUtils.isNumericSpace(strNum5)); // true
public static boolean isNumeric(CharSequence cs) {
if (isEmpty(cs)) {
return false;
} else {
int sz = cs.length();
for(int i = 0; i < sz; ++i) {
if (!Character.isDigit(cs.charAt(i))) {
return false;
}
}
return true;
}
}
④ 将集合拼接为字符串
常见的场景,将集合的内容拼接为字符串
// 自己拼接集合内容为字符串
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
list.add("houqi");
System.out.println(list.toString()); // [zhangsan, lisi, wangwu, zhaoliu, houqi]
如果我们自己将集合的内容拼接为字符串的话,代码可能会写成下面这样:
写法一:利用增强for遍历集合内容,然后使用String += 去拼接字符串,缺点浪费内存,创建了循环次数+1个String类对象。
String strTemp = null;
for(String item : list){
strTemp += item + ",";
}
System.out.println(strTemp); // nullzhangsan,lisi,wangwu,zhaoliu,houqi,
写法二:使用StringBuilder来完成拼接,还是不够优雅。虽然只创建了两个对象,StringBuilder对象和sb.toString()的一个对象。
StringBuilder sb = new StringBuilder();
for (String item : list){
sb.append(item).append(",");
}
System.out.println(sb);
而利用StringUtils.join()方法,我们可以非常简单的去完成集合内容的拼接,其实这段代码的底层也是StringBuilder,只不过我们调用更为方便了。
String joinListToStr = StringUtils.join(list, ",");
System.out.println(joinListToStr); // zhangsan,lisi,wangwu,zhaoliu,houqi
StringUtils.join()方法底层源码
public static String join(Iterator<?> iterator, String separator) {
if (iterator == null) {
return null;
} else if (!iterator.hasNext()) {
return "";
} else {
Object first = iterator.next();
if (!iterator.hasNext()) {
return Objects.toString(first, "");
} else {
StringBuilder buf = new StringBuilder(256);
if (first != null) {
buf.append(first);
}
while(iterator.hasNext()) {
if (separator != null) {
buf.append(separator);
}
Object obj = iterator.next();
if (obj != null) {
buf.append(obj);
}
}
return buf.toString();
}
}
}
小结
StringUtils
是 Apache Commons Lang 库中的一个非常有用的工具类,它提供了许多操作 String
的静态方法。灵活使用,多读源码!