StringTokenizer,洗洗睡吧

本文探讨了StringTokenizer类在字符串分解中的局限性,并介绍了三种更灵活的替代方案:String类的split方法、Scanner类和Pattern类。这些工具支持正则表达式作为分隔符,提供更强大的字符串处理能力。
摘要由CSDN通过智能技术生成
前几天看一个老帖子
[url]http://www.iteye.com/topic/7279?page=2[/url]
其中凤舞凰扬前辈说到了StringTokenizer。
之前没接触过StringTokenizer,看上去类名很长,仿佛很牛13似的。最近了解了一下
[quote]
StringTokenizer 类允许应用程序将字符串分解为标记
[/quote]
也就是分解字符串用的
让我们来看一个简单的例子

StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}

出去结果如下

this
is
a
test

这种不带参数的StringTokenizer使用的分隔符是\t\n\r\f,即空白字符、制表符、换行符、回车符和换页符。
ok,StringTokenizer还提供了另一种构造方法,StringTokenizer(String str, String delim)
从名字上看,可以知道,我们可以自定义delimiter。那么,这个delimiter是不是可以为正则表达式呢?满怀期待的试验一下

String input = "This is just a test";
//设想的delimiter可以为正则表达式
StringTokenizer st = new StringTokenizer(input,"\\s{1}");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}

本以为结果会是

this
is
a
test

哪知一看,结果为

Thi
i
ju
t a te
t

可见,StringTokenizer的delimeter不可以为正则表达式 :(
替代方法?
首先,来看String的split方法

String input = "This is just a test";
String [] str = input.split("\\s{1}");
for(int i=0;i<str.length;i++){
System.out.println(str[i]);
}

输出结果为

this
is
a
test

ok,正确。String的split方法接受的参数可以为正则表达式。
我们可以看一下split方法的定义

public String[] split(String regex) {
return split(regex, 0);
}

其实这个参数他们就是按正则表达式来对待的。(哎,我一直以为只能是字符呢 :oops: )

接着来看Scanner的表现。
[quote]
一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
[/quote]

Scanner scanner = new Scanner(input);
scanner.useDelimiter("\\s{1}");
while(scanner.hasNext()){
System.out.println(scanner.next());
}

同样的,通过设置Delimiter(可以为正则表达式),我们可以很轻松的拆分字符串
输出结果为

This
is
just
a
test

另外,还可以使用Pattern类的split方法,我觉得这个和String的split方法差不多。(Pattern类主要不是用在拆分字符串,而是在正则表达式的应用那里)

Pattern pattern = Pattern.compile("\\s{1}");
str = pattern.split(input);
for(int i=0;i<str.length;i++){
System.out.println(str[i]);
}

结果同样为

This
is
just
a
test


好了,现在已经知道的就有三种方式来代替StringTokenizer了,并且由于StringTokenizer只能做一些很简单的拆分,远不能适应现在的要求,所以,StringTokenizer,你可以放心的撤退了,远离历史舞台吧。
其实sun也知道这个
[quote="sun"]
<tt>StringTokenizer</tt> is a legacy class that is retained for
* compatibility reasons although its use is discouraged in new code. It is
* recommended that anyone seeking this functionality use the <tt>split</tt>
* method of <tt>String</tt> or the java.util.regex package instead.
[/quote]
ps:那个老帖子是04年的。也许那会还没有这么多的替代方法。
不过5年过去了。StringTokenizer就不要再用了。
StringTokenizer,洗洗睡吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值