java.util.StringTokenizer
StringTokenizer: String delimited parsing type
Belongs to: java.util package.
1. Constructor.
StringTokenizer(String str) :
Constructs a StringTokenizer object for parsing str. The default delimiters in java are "space", "tab ('\t')", "newline ('\n')", "carriage return ('\r')".
StringTokenizer(String str, String delim) :
Constructs a StringTokenizer object for parsing str, providing a specified delimiter.
StringTokenizer(String str, String delim, boolean returnDelims) :
Constructs a StringTokenizer object for parsing str, providing a specified delimiter, and specifying whether to return the delimiter.
2. Method.
illustrate:
1. All methods are public;
2. Writing format: [modifier] <return type> <method name ([parameter list])>
Such as:
static int parseInt(String s) means: This method (parseInt) is a class method (static), the return type is (int), and the required parameters of the method are String type.
1. int countTokens () : Returns the number of times the nextToken method was called. If constructors 1 and 2 are used, the return is the number of delimiters (Example 2).
2. boolean hasMoreTokens () : Returns whether there are more delimiters.
3. boolean hasMoreElements () : The result is the same as 2.
4. String nextToken() :返回从当前位置到下一个分隔符的字符串。
5. Object nextElement() :结果同4。
6. String nextToken(String delim) :与4类似,以指定的分隔符返回结果。
一、使用实例:
import java.util.StringTokenizer; public class StringTokenizerExample { public static void main(String[] args) { // TODO Auto-generated method stub defaultStruct(); System.out.println(); /* * 二三不同在于是否返回分隔符 * StringTokenizer st = new StringTokenizer(s,"=",true); * StringTokenizer st = new StringTokenizer(s,"="); * */ defaultStructTwo(); System.out.println(); defaultStructThree(); } public static void defaultStruct(){ String s = new String("The Java platform is the ideal platform for network computing"); StringTokenizer st = new StringTokenizer(s); System.out.println( "Token Total: " + st.countTokens() ); while(st.hasMoreElements()){ System.out.println(st.nextToken()); } } //不返回分隔符 public static void defaultStructTwo(){ String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing"); //StringTokenizer st = new StringTokenizer(s,"=",true); StringTokenizer st = new StringTokenizer(s,"="); System.out.println( "Token Total: " + st.countTokens() ); while( st.hasMoreElements() ){ System.out.println( st.nextToken() ); } } //返回分隔符 public static void defaultStructThree(){ String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing"); StringTokenizer st = new StringTokenizer(s,"=",true); System.out.println( "Token Total: " + st.countTokens() ); while( st.hasMoreElements() ){ System.out.println( st.nextToken() ); } } }
结果:
Token Total: 10 The Java platform is the ideal platform for network computing Token Total: 10 The Java platform is the ideal platform for network computing Token Total: 19 The = Java = platform = is = the = ideal = platform = for = network = computing
二、性能测试:
来源:http://blog.csdn.net/songylwq/article/details/9016609
import java.util.Random; import java.util.StringTokenizer; /** * String测试类 * * @author xiaori.Liu * */ public class StringTest { public static void main(String args[]) { String orginStr = getOriginStr(100); System.out.println(orginStr); ////////////// String.splic()表现////////////////////////////////////////////// System.out.println("使用String.splic()的切分字符串"); long st1 = System.nanoTime(); String[] result = orginStr.split("\\."); System.out.println("String.splic()截取字符串用时:" + (System.nanoTime() - st1)); System.out.println("String.splic()截取字符串结果个数:" + result.length); System.out.println(); ////////////// StringTokenizer表现////////////////////////////////////////////// System.out.println("使用StringTokenizer的切分字符串"); long st3 = System.nanoTime(); StringTokenizer token = new StringTokenizer(orginStr, "."); System.out.println("StringTokenizer截取字符串用时:" + (System.nanoTime() - st3)); System.out.println("StringTokenizer截取字符串结果个数:" + token.countTokens()); System.out.println(); //////////////////// String.substring()表现////////////////////////////////////////// long st5 = System.nanoTime(); int len = orginStr.lastIndexOf("."); System.out.println("使用String.substring()切分字符串"); int k = 0, count = 0; for (int i = 0; i <= len; i++) { if (orginStr.substring(i, i + 1).equals(".")) { if (count == 0) { orginStr.substring(0, i); } else { orginStr.substring(k + 1, i); if (i == len) { orginStr.substring(len + 1, orginStr.length()); } } k = i; count++; } } System.out.println("String.substring()截取字符串用时" + (System.nanoTime() - st5)); System.out.println("String.substring()截取字符串结果个数:" + (count + 1)); } /** * 构造目标字符串 eg:10.123.12.154.154 * * @param len * 目标字符串组数(每组由3个随机数组成) * @return */ private static String getOriginStr(int len) { StringBuffer sb = new StringBuffer(); StringBuffer result = new StringBuffer(); Random random = new Random(); for (int i = 0; i < len; i++) { sb.append(random.nextInt(9)).append(random.nextInt(9)).append(random.nextInt(9)); result.append(sb.toString()); sb.delete(0, sb.length()); if (i != len - 1) result.append("."); } return result.toString(); } }
结果:
347.250.685.477.054.632.034.341.582.131.205.087.160.754.152.534.228.028.146.687.563.067.613.427.410.070.727.633.150.621.688.503.782.634.337.034.802.115.777.531.563.133.023.078.827.053.000.086.877.541.118.133.252.242.031.760.508.534.663.481.175.317.652.162.610.144.517.172.413.642.135.623.822.234.685.200.081.842.621.351.836.252.615.755.480.825.535.363.483.103.667.387.214.432.140.001.500.252.437.213 使用String.splic()的切分字符串 String.splic()截取字符串用时:25555768 String.splic()截取字符串结果个数:100 使用StringTokenizer的切分字符串 StringTokenizer截取字符串用时:45759 StringTokenizer截取字符串结果个数:100 使用String.substring()切分字符串 String.substring()截取字符串用时362875 String.substring()截取字符串结果个数:100
StringTokenizer则是表现最优秀的,基本上平稳,始终保持在5000ns一下。
结论
最终,StringTokenizer在截取字符串中效率最高,不论数据量大小,几乎持平。substring则要次之,数据量增加耗时也要随之增加。split则是表现最差劲的。
究其原因,split的实现方式是采用正则表达式实现,所以其性能会比较低。至于正则表达式为何低,还未去验证。split源码如下:
public String[] split(String regex, int limit) { return Pattern.compile(regex).split(this, limit); }
..