java 分割字符串转换成一个数组

一时失言乱红尘 2022-04-08 13:12 285阅读 0赞

例如:String str = “1,2,3,4,5,6,a,b,c”;

方法一:

String[] strArr= str.split(“,”);

方法二:

使用 StringTokenizer

  1. String str = "1,2,3,4,5,6,a,b,c";
  2. StringTokenizer token = new StringTokenizer(str, ",");
  3. String [] strArr = new String[token.countTokens()];
  4. int i=0;
  5. while(token.hasMoreElements()){
  6. strArr[i++]=token.nextToken();
  7. }

#

关于两者的比较

String.Split()使用正则表达式,而StringTokenizer的只是使用逐字分裂的字符。

StringTokenizer在截取字符串中的效率最高.但自己在做测试的时候,分割1两千万以内的字符串,感觉二者时间开销区别不大,甚至 split()花的时间很多时候比StringTokenizer所花的时间还少。但是大于两千万以后,split()方法会执行很长很长时间,甚至上个厕所回来还没执行完。

以下为测试代码:

1、使用split()

  1. StringBuffer sb = new StringBuffer("a");
  2. for (int i = 0; i < 10000000; i++) {
  3. sb.append(",");
  4. sb.append("a");
  5. }
  6. String str= sb.toString();
  7. System.out.println(new Date());
  8. String[] strArr= str.split(",");
  9. System.out.println(new Date());

控制台打印:

  1. Fri Dec 14 11:20:46 CST 2018
  2. Fri Dec 14 11:20:49 CST 2018

2、使用StringTokenizer

  1. StringBuffer sb = new StringBuffer("a");
  2. for (int i = 0; i < 10000000; i++) {
  3. sb.append(",");
  4. sb.append("a");
  5. }
  6. System.out.println(new Date());
  7. StringTokenizer to = new StringTokenizer(str,",",true);
  8. String[] re = new String[to.countTokens()];
  9. int i=0;
  10. while(to.hasMoreElements()){
  11. re[i++] = to.nextToken();
  12. }
  13. System.out.println(new Date());

控制台打印:

  1. Fri Dec 14 11:19:48 CST 2018
  2. Fri Dec 14 11:20:04 CST 2018

关于StringTokenizer 介绍

StringTokenizer是一个用来分隔String的应用类

1. 构造函数。

  1. 1. StringTokenizer(String str) :构造一个用来解析strStringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
  2. 2. StringTokenizer(String str, String delim) :构造一个用来解析strStringTokenizer对象,并提供一个指定的分隔符。
  3. 3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析strStringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

2. 方法介绍

  1. int   countTokens():返回nextToken方法被调用的次数。如果采用构造函数12,返回的就是分隔符数量
  2. boolean hasMoreElements():返回是否还有分隔符。
  3. boolean hasMoreTokens():同上
  4. String  nextToken():返回从当前位置到下一个分隔符的字符串。
  5. Object nextElement():结果同上,除非返回的是Object而不是String
  6. String nextToken(String delim):同nextToken(),以指定的分隔符返回结果

例:(注意:StringTokenizer的分隔符不需要使用转义字符)

  1. String str = "a/b;c]d}e*f,g";
  2. StringTokenizer token = new StringTokenizer(str, "}]/;*,");// 默认不打印分隔符
  3. // StringTokenizer token=new StringTokenizer(str,"}]/;*,",true);//打印分隔符
  4. // StringTokenizer token=new StringTokenizer(str,"}]/;*,",false);//不打印分隔符
  5. while(token.hasMoreTokens()){
  6. System.out.println(token.nextToken());
  7. }

拓展:

String.split 常用于切割字符串,split传入的参数是正则表达式,它的内部是每次都comiple正则表达式,再调用Pattern.split方法

jdk源码:

  1. public String[] split(String regex) {
  2. return split(regex, 0);
  3. }
  4. public String[] split(String regex, int limit) {
  5. return Pattern.compile(regex).split(this, limit);
  6. }

所以:如果调用String.split非常频繁的话,每次都重新编译正则表达式的代价很高,性能会受到很大影响,此时可以预编译Pattern,再调用Pattern.split方法

  1. String str = "1,2,3,4,5,6,a,b,c";
  2. String[] strArr = str.split(",");
  3. 替代为
  4. Pattern pattern = Pattern.compile(",");
  5. String[] strArr = pattern.split(str,0);

发表评论

表情:
评论列表 (有 0 条评论,285人围观)

还没有评论,来说两句吧...

相关阅读