性能瓶颈分析
- 频繁的字符串拆分操作:
StringTokenizer
在拆分字符串时,每次遇到分隔符都会创建新的子字符串对象,对于长字符串来说,这会导致大量的内存分配和垃圾回收开销。
- 分隔符处理复杂:当存在多种复杂分隔符时,
StringTokenizer
需要依次检查每个字符是否为分隔符,这增加了字符检查的时间复杂度。
优化方案
- 使用正则表达式拆分:
split
方法接受正则表达式作为参数,可以一次性处理多种分隔符,减少字符检查次数。但要注意正则表达式性能问题,避免使用过于复杂的表达式。
- 自定义字符扫描:手动遍历字符串,记录分隔符位置,然后提取子字符串。这样可以减少不必要的对象创建,提高性能。
代码示例(自定义字符扫描方案)
import java.util.ArrayList;
import java.util.List;
public class CustomStringSplitter {
public static List<String> split(String input, String delimiters) {
List<String> result = new ArrayList<>();
int start = 0;
for (int i = 0; i < input.length(); i++) {
if (delimiters.indexOf(input.charAt(i)) != -1) {
if (i - start > 0) {
result.add(input.substring(start, i));
}
start = i + 1;
}
}
if (input.length() - start > 0) {
result.add(input.substring(start));
}
return result;
}
public static void main(String[] args) {
String input = "a,b;c:d e";
String delimiters = ",; :";
List<String> parts = split(input, delimiters);
for (String part : parts) {
System.out.println(part);
}
}
}