length()
方法,返回字符串的字符数量(包括空格和特殊字符),"abc".length()
返回3,注意该方法统计的是UTF-16编码的代码单元数量,对于包含Unicode扩展字符(如emoji)的字符串,实际字符数可能小于返回值,此时需用codePointCount()
精确计算。使用 substring()
方法(基础版)
原理:截取字符串从索引0开始到指定长度的子串。
代码示例:
public static String truncate(String input, int maxLength) { if (input == null || input.length() <= maxLength) { return input; } return input.substring(0, maxLength); }
调用示例:
String result = truncate("Hello, World!", 5); // 返回 "Hello"
注意事项:
- 若字符串长度小于
maxLength
,直接返回原字符串。 - 需检查
null
值避免NullPointerException
。
处理多字节字符(如中文)
问题:直接使用 substring()
可能截断多字节字符(如中文、Emoji),导致乱码。
解决方案:结合 StringBuilder
和字符边界检查。
代码示例:
public static String safeTruncate(String input, int maxLength) { if (input == null || input.length() <= maxLength) { return input; } StringBuilder sb = new StringBuilder(maxLength); int totalChars = 0; for (char c : input.toCharArray()) { totalChars += (c < 256) ? 1 : 2; // 简单区分单/双字节字符 if (totalChars > maxLength) break; sb.append(c); } return sb.toString(); }
调用示例:
String result = safeTruncate("你好Java", 5); // 返回 "你好J"(避免乱码)
添加省略号(…)
场景:截短后显示省略号提升可读性。
代码示例:
public static String truncateWithEllipsis(String input, int maxLength) { if (input == null || input.length() <= maxLength) { return input; } return input.substring(0, maxLength - 3) + "..."; // 保留3位给省略号 }
调用示例:
String result = truncateWithEllipsis("This is a long text", 10); // 返回 "This is..."
使用第三方库(Apache Commons Lang)
推荐:StringUtils
提供更健壮的截断方法。
步骤:
-
添加依赖(Maven):
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
-
代码示例:
import org.apache.commons.lang3.StringUtils; String result = StringUtils.truncate("Hello, World!", 5); // 返回 "Hello"
优势:自动处理
null
、支持偏移量,适合复杂场景。
关键注意事项
- 边界检查:始终验证
maxLength
是否为正数,避免负数导致异常。 - 多语言支持:处理国际化文本时,优先考虑字符边界(如
BreakIterator
)。 - 性能:对超长字符串,避免重复创建子串,用
StringBuilder
优化。 - 空值安全:方法入口处检查
null
,增强代码健壮性。
最佳实践总结
场景 | 推荐方法 | 示例输出(maxLength=5) |
---|---|---|
基础英文截短 | substring() |
“Hello” → “Hello” |
含中文/Emoji | 字符边界检查(safeTruncate ) |
“你好🌍” → “你好” |
需省略号提示 | 拼接 | “LongText” → “Long…” |
企业级项目 | Apache Commons StringUtils |
内置安全处理 |
引用说明:
- Oracle官方文档:Java String类
- Apache Commons Lang:StringUtils文档
- Unicode处理规范:Unicode标准
通过以上方法,您可安全高效地实现Java字符串截短,确保代码符合国际化和生产环境要求。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/29822.html