2013-10-30 65 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