在 Java 开发中,对字符串(String)的操作无处不在。然而,原生的 String 类方法在面对 null 值时常常会抛出 NullPointerException,这使得代码中充斥着大量的空值检查,降低了可读性和开发效率。
Apache Commons Lang 库中的 StringUtils 类正是为了解决这一痛点而生。它提供了一套空安全(null-safe)、功能强大且易于使用的静态方法,覆盖了从基本判断到复杂转换的几乎所有常见字符串操作场景。
设计原则:
null 时,不抛异常,而是返回合理默认值(如 null、""、false、0 等)。null 输入而抛出 NullPointerException,则视为 bug。本文将 StringUtils 的众多方法按功能划分为八大类别,并辅以典型用例,助你快速上手。
isEmpty:为 null 或长度为 0(即 "")。isNotEmpty:非空(即 !isEmpty)。isBlank:为 null、空或仅含空白字符。isNotBlank:非空白(即 !isBlank)。isAnyEmpty:任意一个为 null 或 ""。isAnyBlank:任意一个为 null、空或纯空白。isNoneEmpty:所有都不为 null 且不为空字符串。isNoneBlank:所有都不为 null、空或纯空白。isAllEmpty:所有都为 null 或 ""。isAllBlank:所有都为 null、空或仅含空白字符。containsWhitespace:是否包含任何空白字符。isAllLowerCase:所有字母均为小写(忽略非字母字符)。isAllUpperCase:所有字母均为大写(忽略非字母字符)。isMixedCase:同时包含大写和小写字母。trim:去除首尾 ASCII 控制字符(码值 ≤ 32)。strip:去除首尾所有 Character.isWhitespace() 定义的空白字符。stripStart:从开头移除指定字符集中的任意字符。stripEnd:从结尾移除指定字符集中的任意字符。deleteWhitespace:删除字符串中所有空白字符。normalizeSpace:将连续空白替换为单个空格,并去除首尾空格。stripAccents:移除 Unicode 重音符号(如 café → cafe)。upperCase:使用系统默认 Locale 转为大写。lowerCase:使用系统默认 Locale 转为小写。capitalize:将首字母转为大写,其余不变。uncapitalize:将首字母转为小写,其余不变。swapCase:将大写字母转小写,小写字母转大写,其他不变。equals:空安全地判断两个字符序列是否相等。equalsIgnoreCase:忽略大小写的空安全相等判断。compare:空安全字典序比较(null 视为最小)。compareIgnoreCase:忽略大小写的空安全字典序比较。equalsAny:是否等于任意一个候选字符串。equalsAnyIgnoreCase:忽略大小写的 equalsAny。startsWith:是否以指定前缀开头。startsWithIgnoreCase:忽略大小写的前缀判断。startsWithAny:是否以任意一个给定字符串开头。endsWith:是否以指定后缀结尾。endsWithIgnoreCase:忽略大小写的后缀判断。endsWithAny:是否以任意一个给定字符串结尾。contains:是否包含指定子串。containsIgnoreCase:忽略大小写的包含判断。containsAny:是否包含任意一个指定字符或子串。containsNone:是否不包含任何非法字符。containsOnly:是否仅由指定字符组成。indexOf:返回指定字符或子串首次出现的位置,未找到返回 -1。lastIndexOf:返回指定字符或子串最后一次出现的位置。substring:从指定位置截取子串。left:获取左起指定长度的字符。right:获取右起指定长度的字符。mid:从指定位置开始取指定长度的字符。substringBefore:返回第一个分隔符之前的部分。substringAfter:返回第一个分隔符之后的部分。substringBetween:返回两个相同标签或开闭标签之间的内容。substringsBetween:返回所有匹配的开闭标签之间的内容(数组)。split:按空白、字符或字符串分割。splitByWholeSeparator:按完整分隔符分割(非正则)。splitPreserveAllTokens:分割时保留空 token。join:连接数组或可迭代对象的元素。joinWith:类似 String.join,支持任意对象。wrap:用字符或字符串包裹原字符串。unwrap:若首尾是成对的指定字符或字符串,则移除。leftPad:左填充至指定长度。rightPad:右填充至指定长度。center:居中填充至指定长度。repeat:重复字符串或字符多次。abbreviate:缩略并在末尾加 ...(总长不超过指定值)。abbreviateMiddle:保留首尾,中间替换为指定字符串。rotate:循环移位(正数右移,负数左移)。replace:全局替换所有匹配项。replaceEach:按顺序批量替换(一次遍历)。replaceEachRepeatedly:重复替换直到结果稳定。replaceChars:按字符映射表批量替换。replacePattern:使用正则表达式替换。remove:删除所有匹配的子串或字符。removeStart:若以指定前缀开头,则移除该前缀。removeEnd:若以指定后缀结尾,则移除该后缀。removePattern:使用正则表达式删除匹配内容。overlay:用新字符串覆盖指定区间的内容。defaultString:若为 null,返回空字符串或指定默认值。defaultIfEmpty:若为 null 或 "",返回指定默认值。defaultIfBlank:若为 null、"" 或仅空白,返回指定默认值。firstNonEmpty:返回首个非 null 且非空的字符串。firstNonBlank:返回首个非 null、非空且非纯空白的字符串。reverse:反转整个字符串。reverseDelimited:按分隔符分段后反转顺序(如 "a.b.c" → "c.b.a")。getCommonPrefix:返回多个字符串的最长公共前缀。difference:返回第二个字符串中与第一个不同的后缀部分。indexOfDifference:返回两个或多个字符串第一个出现差异的位置。countMatches:统计指定字符或子串出现的次数。getLevenshteinDistance:计算两字符串的编辑距离(可设阈值)。toEncodedString:将字节数组安全地解码为字符串。toString:安全调用 toString(),null 返回 "null" 或自定义字符串。isAlpha:是否只包含字母(Unicode 字母)。isAlphaSpace:是否只包含字母和空格。isAlphanumeric:是否只包含字母和数字。isAlphanumericSpace:是否只包含字母、数字和空格。isNumeric:是否只包含数字字符(包括 Unicode 数字)。isNumericSpace:是否只包含数字和空格。以下方法已标记
@Deprecated,建议迁移到org.apache.commons.text.StringUtils(如适用)。
appendIfMissing:若不以指定后缀结尾,则追加。prependIfMissing:若不以指定前缀开头,则前置。chomp:移除末尾换行符(建议改用 removeEnd)。chop:移除最后一个字符(行为模糊,不推荐)。⚠️ 官方建议:
appendIfMissing/prependIfMissing系列已迁移至 Apache Commons Text 库(org.apache.commons.text.StringUtils),未来版本可能彻底移除。
StringUtils 是 Apache Commons Lang 库中最广受青睐的工具类之一,堪称 Java 字符串处理的瑞士军刀。
它以三大核心优势,彻底革新了日常字符串操作:
null 输入,从根本上杜绝 NullPointerException;借助 StringUtils,开发者能写出更简洁、健壮且可读性更高的代码。
下次当你需要处理字符串时,不妨先看看 StringUtils 是否已经为你准备好了现成的解决方案。这不仅能让你的代码更健壮,还能显著提升开发效率。