2013-10-30 159 views
11

我一直在使用String类的String[] split(String)来分割给定分隔符的任何字符串,并且它工作正常。使用StringTokenizer和String.split()之间的区别?

但是,现在预计将重新考虑与StringTokenizer相同的逻辑。但是使用其中一个的区别和好处是什么。

此外,我觉得String[]返回split()在一次调用是非常有效的选择比使用StringTokenizer类的对象。

+2

参见本:http://stackoverflow.com/questions/691184/scanner-vs-stringtokenizer-vs-string-split – Jhanvi

+1

的StringTokenizer很少使用这些天。我会看看Scanner。 –

回答

15

- >String.split()Pattern.split()给你一个简单的语法来做后者,但这基本上就是他们所做的一切。如果你想解析结果字符串,或者根据特定标记中途改变分隔符,他们将不会帮助你。

- >StringTokenizerString.split()更具限制性,而且使用起来也有点烦琐。它本质上是为了抽出由固定子字符串分隔的令牌而设计的。由于这个限制,它的速度是String.split()的两倍。 (请参阅我的comparison of String.split() and StringTokenizer。)它也早于正则表达式API,其中String.split()是其中的一部分。

从我的定时中,您会注意到String.split()仍然可以在典型机器上以几毫秒标记数千个字符串。另外,与StringTokenizer相比,它具有以字符串数组的形式提供输出的优势,这通常是您想要的。如StringTokenizer所提供的使用Enumeration在大多数情况下也是“句法上的挑剔”。从这个角度来看,StringTokenizer现在有点浪费空间,你也可以使用String.split()。从这个链接

+0

StringTokenizer从内存角度来看是否更轻?看起来像'split()'会增加大约2倍。 – Larsenal

+0

它们处理字符串输出的方式也有所不同。理论上,如果你的字符串以空格开头(s)StringTokenizer忽略这些并返回第一个字符串,但是拆分功能会在返回的数组中创建一个空字符串。 –

17

看看在JavaDocs

的StringTokenizer是保留兼容性 原因,虽然它的使用是在新代码气馁的遗留类。建议 任何寻求此功能的人都使用字符串 或java.util.regex包的拆分方法。

下面的示例示出了如何String.split方法可以是 用于将字符串分解成它的基本标记:

String[] result = "this is a test".split("\\s"); 
for (int x=0; x<result.length; x++) 
    System.out.println(result[x]); 
+1

+1 split()更清洁 –

1

String#split接受一个正则表达式是否StringTokenizer只是接受String,通过该将分割字符串。您应该始终坚持String#split,它比StringTokenizer更健壮。

1

阅读this

的StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。

0

http://docs.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html 说:

的StringTokenizer是保留兼容性的原因,虽然它的使用是在新代码气馁的遗留类。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。

所以我会说,不要改变它,并向建议重构它的人显示该行。也许他们有旧信息或另一个很好的理由告诉你。

1

我有以下程序,

字符串“X”是一个标签分开 12s34;

public class Testoken { 
     public static void main(String[] args) { 
      String x = "1 2 s  3   4 "; 
      StringTokenizer st = new StringTokenizer(x,"\t"); 
      int i = 0; 
      while(st.hasMoreTokens()){ 
       System.out.println("token-->"+st.nextToken());    
       i++; 
      } 
      System.out.println("i-->"+i);//elements from tokenizer 
      String [] a = x.split("\t"); 
      System.out.println("length--->"+a.length); 
      for(int y = 0;y<a.length;y++){ 
      System.out.println("value-->"+a[y]);//elements from split 
      } 
     } 
    } 





Output: 

token-->1 
token-->2 
token-->s 
token-->3 
token-->4 
i-->5 
length--->8 
value-->1 
value-->2 
value-->s 
value--> 
value-->3 
value--> 
value--> 
value-->4 
+0

输出: 令牌 - > 1 令牌 - > 2 令牌 - >取值 令牌 - > 3 令牌 - > 4 I - > 5 长度---> 8 值 - - > 1个 值 - > 2 值 - >取值 值 - > 值 - > 3 值 - > 值 - > 值 - > 4 – user2114253