StringTokenizer在JAVA中拆分字符串是否更有效?

StringTokenizer在JAVA中拆分字符串是否更有效?,java,string,split,stringtokenizer,Java,String,Split,Stringtokenizer,我一直在解决SPOJ的一个问题 首先,我尝试使用string的split方法拆分输入字符串,提交后得到了TLE 我的代码使用split方法 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.regex.Pattern; import java.util.regex.Matcher; class ABSYS { pub

我一直在解决SPOJ的一个问题

首先,我尝试使用string的
split
方法拆分输入字符串,提交后得到了TLE

我的代码使用split方法

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;


class ABSYS {
    public static void main(String[] args) throws IOException {
        int t;
        String[] numArray = new String[2];
        String[] numArray2 = new String[2];
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        t = Integer.parseInt(reader.readLine());
        while(t > 0) {
            String input = reader.readLine();
            if(input.isEmpty()) {
                continue;
            }
            numArray = input.split("\\s{1}=\\s{1}");
            numArray2 = numArray[0].split("\\s{1}\\+\\s{1}");
            Pattern pattern = Pattern.compile("machula");
            Matcher matcher = pattern.matcher(numArray[1]);
            if(matcher.find()) {
                System.out.println(numArray[0] + " = " + (Integer.parseInt(numArray2[0]) + Integer.parseInt(numArray2[1])));
            }
            else {
                matcher = pattern.matcher(numArray2[0]);
                if(matcher.find()) {
                    System.out.println((Integer.parseInt(numArray[1]) - Integer.parseInt(numArray2[1])) + " + " + numArray2[1] + " = " + numArray[1]);
                }
                else {
                    System.out.println(numArray2[0] + " + " + (Integer.parseInt(numArray[1]) - Integer.parseInt(numArray2[0])) + " = " + numArray[1]);
                }
            }
            t--;
        }
    }
}
在多次尝试之后,我失败了,无法使我的代码更加高效

然后,今天我读了关于
StringTokenizer
,并在我的代码中使用了它,我就在那里得到了它(在spoj上)

我的代码使用StringTokenizer

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.StringTokenizer;


class ABSYS {
    public static void main(String[] args) throws IOException {
        int t, a = 0, b = 0, c = 0, matchula = 0;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        Pattern pattern = Pattern.compile("^(\\d)+$");
        t = Integer.parseInt(reader.readLine());
        while(t > 0) {
            String input = reader.readLine();
            if(input.isEmpty()) {
                continue;
            }
            StringTokenizer tokenizer = new StringTokenizer(input);
            String token = tokenizer.nextToken();
            if(pattern.matcher(token).matches()) {
                a = Integer.parseInt(token);
            }
            else
                matchula = 1;

            tokenizer.nextToken();
            token = tokenizer.nextToken();
            if(pattern.matcher(token).matches()) {
                System.out.println("b = " + token);
                b = Integer.parseInt(token);
            }
            else
                matchula = 2;

            tokenizer.nextToken();
            token = tokenizer.nextToken();
            if(pattern.matcher(token).matches()) {
                c = Integer.parseInt(token);
            }
            else
                matchula = 3;
            switch(matchula) {
                case 1: System.out.println((c-b) + " + " + b + " = " + c);
                        break;
                case 2: System.out.println(a + " + " + (c-a) + " = " + c);
                        break;
                case 3: System.out.println(a + " + " + b + " = " + (a+b));
                        break;
            }
            t--;
        }
    }
}
在JAVA文档中,他们不鼓励使用StringTokenizer

StringTokenizer是一个遗留类,尽管新代码中不鼓励使用它,但出于兼容性原因保留它。建议任何寻求此功能的人改用String的split方法或java.util.regex包

如回答中所述

如果我想用比单个字符更复杂的逻辑对字符串进行标记(例如,在\r\n上拆分),我不能使用StringTokenizer,但可以使用string.split()

我的怀疑

  • 为什么会这样,尽管我发现它更省时
  • 阻止使用
    StringTokenizer
    的原因是什么
  • 如果你想像我的问题一样使用简单的正则表达式,那么
    StringTokenizer
    String.split()
    好吗
  • String.split()比StringTokenizer更灵活、更易于使用。StringTokenizer早于Java对正则表达式的支持,而String.split()支持正则表达式,这使得它比StringTokenizer强大得多。另外,String.split的结果是一个字符串数组,这通常是我们想要的结果。StringTokenizer确实比String.split()快,但在大多数实际应用中,String.split()已经足够快了


    查看此问题的答案以了解更多详细信息

    虽然从技术上讲,
    StringTokenizer
    String.split()
    更快,但当您将范围缩小到单字符分隔符时,它们的性能几乎相同


    查看
    String.split()
    源代码,它会检查regex模式是否是简单的分隔符,如果是,它会执行老式的while循环来搜索
    字符串。在我做的一个简单测试中,我发现使用单个
    char
    解析字符串的时间几乎没有差别。这是
    StringTokenizer
    的典型用例。因此,对于如此微小的性能提升来说,真的不值得所有额外的代码。

    你所说的“
    StringTokenizer
    早于Java对正则表达式的支持,而String.split()支持正则表达式”是什么意思?我的意思是,StringTokenizer来自一个时代(Java 1.0)在此之前,Java为正则表达式提供了标准库,因此它不支持正则表达式,而String.split()支持正则表达式。