MST

星途 面试题库

面试题:Java里优化使用StringTokenizer处理复杂分隔符字符串的性能

在处理非常长且包含多种复杂分隔符的字符串时,常规使用StringTokenizer可能性能不佳。请你分析可能存在的性能瓶颈,并提出至少两种优化方案,同时针对其中一种方案给出改进后的代码示例。
13.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

性能瓶颈分析

  1. 频繁的字符串拆分操作StringTokenizer在拆分字符串时,每次遇到分隔符都会创建新的子字符串对象,对于长字符串来说,这会导致大量的内存分配和垃圾回收开销。
  2. 分隔符处理复杂:当存在多种复杂分隔符时,StringTokenizer需要依次检查每个字符是否为分隔符,这增加了字符检查的时间复杂度。

优化方案

  1. 使用正则表达式拆分split方法接受正则表达式作为参数,可以一次性处理多种分隔符,减少字符检查次数。但要注意正则表达式性能问题,避免使用过于复杂的表达式。
  2. 自定义字符扫描:手动遍历字符串,记录分隔符位置,然后提取子字符串。这样可以减少不必要的对象创建,提高性能。

代码示例(自定义字符扫描方案)

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);
        }
    }
}