在Java编程中,字符串截取是高频操作,用于提取子串、解析数据或格式化文本,核心方法是substring()
,属于String
类,设计时需注意索引规则和性能,以下是详细指南:
核心方法:substring()
String
类提供两个重载方法:
-
单参数截取
substring(int beginIndex)
- 从
beginIndex
开始截取到字符串末尾。 - 示例:
String str = "Hello, World!"; String result = str.substring(7); // 从索引7开始 System.out.println(result); // 输出 "World!"
- 从
-
双参数截取
substring(int beginIndex, int endIndex)
- 截取
[beginIndex, endIndex)
区间(左闭右开)。 - 示例:
String str = "Java Programming"; String result = str.substring(5, 16); // 索引5到15 System.out.println(result); // 输出 "Programming"
- 截取
关键注意事项
-
索引规则
- 索引从0开始,最大值为
字符串长度-1
。 - 越界问题:
- 若索引为负数或超过长度,抛出
StringIndexOutOfBoundsException
。 - 安全做法:先校验索引
if (beginIndex >= 0 && endIndex <= str.length()) { str.substring(beginIndex, endIndex); }
- 若索引为负数或超过长度,抛出
- 索引从0开始,最大值为
-
不可变性
- 截取后返回新字符串,原字符串不变:
String original = "Apple"; String sub = original.substring(0, 3); // "App" System.out.println(original); // 仍输出 "Apple"
- 截取后返回新字符串,原字符串不变:
其他截取方法
-
split() 分割字符串
按正则表达式拆分,适合提取特定部分:String data = "name=John;age=30"; String[] parts = data.split(";"); System.out.println(parts[0]); // 输出 "name=John"
-
StringTokenizer(旧版)
适用于简单分隔符场景(不推荐新项目使用):StringTokenizer tokenizer = new StringTokenizer("one,two,three", ","); while (tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); // 依次输出 "one" "two" "three" }
性能与安全建议
- 大字符串处理
- 避免对超大字符串(如文件内容)频繁截取,可能引发内存浪费,改用
StringBuilder
或流处理。
- 避免对超大字符串(如文件内容)频繁截取,可能引发内存浪费,改用
- 用户输入安全
截取用户输入时(如SQL、HTML),需先转义特殊字符,防止注入攻击。
- 编码问题
- 含多字节字符(如中文)时,确保索引对齐字符边界,避免截断乱码:
String chinese = "你好世界"; // 错误:可能截断中文字符 String safeSub = chinese.substring(0, 2); // "你好"(一个中文占2字节,但Java字符是UTF-16编码,一个字符是一个char)
- 含多字节字符(如中文)时,确保索引对齐字符边界,避免截断乱码:
实战示例
场景:提取URL中的域名
String url = "https://www.example.com/page"; // 步骤1:移除协议部分 int start = url.indexOf("://") + 3; // 索引跳到"www"开头 // 步骤2:找到第一个斜杠位置 int end = url.indexOf("/", start); // 步骤3:截取域名 String domain = (end == -1) ? url.substring(start) : url.substring(start, end); System.out.println(domain); // 输出 "www.example.com"
- 首选
substring()
:精确控制截取范围,注意索引左闭右开。 - 避免越界:始终校验索引范围。
- 考虑性能:大文本用
StringBuilder
或Arrays.copyOfRange
(字符数组截取)。 - 安全第一:处理外部输入时,结合安全库(如Apache Commons Text)过滤风险字符。
引用说明:
- Oracle官方文档:String.substring()
- 《Java核心技术卷I》(Cay S. Horstmann著)字符串操作章节
- 安全实践参考:OWASP Java安全指南
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/31571.html