java 分割字符串转换成一个数组
例如:String str = “1,2,3,4,5,6,a,b,c”; 方法一: String[] strArr= str.split(“,”);
方法二: 使用 StringTokenizer
String str = "1,2,3,4,5,6,a,b,c"; StringTokenizer token = new StringTokenizer(str, ","); String [] strArr = new String[token.countTokens()]; int i=0; while(token.hasMoreElements()){ strArr[i++]=token.nextToken(); }
关于两者的比较 String.Split()使用正则表达式,而StringTokenizer的只是使用逐字分裂的字符。
StringTokenizer在截取字符串中的效率最高.但自己在做测试的时候,分割1两千万以内的字符串,感觉二者时间开销区别不大,甚至 split()花的时间很多时候比StringTokenizer所花的时间还少。但是大于两千万以后,split()方法会执行很长很长时间,甚至上个厕所回来还没执行完。
以下为测试代码:
1、使用split()
StringBuffer sb = new StringBuffer("a"); for (int i = 0; i < 10000000; i++) { sb.append(","); sb.append("a"); } String str= sb.toString(); System.out.println(new Date()); String[] strArr= str.split(","); System.out.println(new Date());
控制台打印:
Fri Dec 14 11:20:46 CST 2018 Fri Dec 14 11:20:49 CST 2018
2、使用StringTokenizer
StringBuffer sb = new StringBuffer("a"); for (int i = 0; i < 10000000; i++) { sb.append(","); sb.append("a"); } System.out.println(new Date()); StringTokenizer to = new StringTokenizer(str,",",true); String[] re = new String[to.countTokens()]; int i=0; while(to.hasMoreElements()){ re[i++] = to.nextToken(); } System.out.println(new Date());
控制台打印:
Fri Dec 14 11:19:48 CST 2018 Fri Dec 14 11:20:04 CST 2018
关于StringTokenizer 介绍 StringTokenizer是一个用来分隔String的应用类
1. 构造函数。
1. StringTokenizer(String str) :构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘ ’)”、“换行符(‘ ’)”、“回车符(‘ ’)”。 2. StringTokenizer(String str, String delim) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。 3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。
2. 方法介绍
int countTokens():返回nextToken方法被调用的次数。如果采用构造函数1和2,返回的就是分隔符数量 boolean hasMoreElements():返回是否还有分隔符。 boolean hasMoreTokens():同上 String nextToken():返回从当前位置到下一个分隔符的字符串。 Object nextElement():结果同上,除非返回的是Object而不是String String nextToken(String delim):同nextToken(),以指定的分隔符返回结果
例:(注意:StringTokenizer的分隔符不需要使用转义字符)
String str = "a/b;c]d}e*f,g"; StringTokenizer token = new StringTokenizer(str, "}]/;*,");// 默认不打印分隔符 // StringTokenizer token=new StringTokenizer(str,"}]/;*,",true);//打印分隔符 // StringTokenizer token=new StringTokenizer(str,"}]/;*,",false);//不打印分隔符 while(token.hasMoreTokens()){ System.out.println(token.nextToken()); }
拓展: String.split 常用于切割字符串,split传入的参数是正则表达式,它的内部是每次都comiple正则表达式,再调用Pattern.split方法 jdk源码:
public String[] split(String regex) { return split(regex, 0); } public String[] split(String regex, int limit) { return Pattern.compile(regex).split(this, limit); }
所以:如果调用String.split非常频繁的话,每次都重新编译正则表达式的代价很高,性能会受到很大影响,此时可以预编译Pattern,再调用Pattern.split方法
String str = "1,2,3,4,5,6,a,b,c"; String[] strArr = str.split(","); 替代为 Pattern pattern = Pattern.compile(","); String[] strArr = pattern.split(str,0);