java按指定字符切割字符串,字符串切分java
今天给大家介绍一点知识点,但是会很实用。也就是我们在编写Java代码的时候,如果要截字符串,可以巧妙地运用一些技巧,让性能提升5~10倍。下面不说废话,就来给大家干货!
工作中常用的split()切割字符串效率高吗?
首先,我们使用下面的代码拼接一个由逗号分隔的超长字符串。从0到9999的每个数字都用逗号分隔,并拼接成一个超长字符串,以便我们进行实验。代码如下:
public class StringSplitTest { public static void main(String[]args){ String String=null;string buffer string buffer=new string buffer();int max=10000for(int I=0;i maxI){ string buffer . append(I);if(i max - 1) { stringBuffer.append(,);} } string=string buffer . tostring();}}那我们可以用下面的代码测试一下。如果用最基本的拆分方法切割超长串,循环切割1w次需要多长时间?请参见下面的代码测试:
public class StringSplitTest { public static void main(String[]args){ String String=null;string buffer string buffer=new string buffer();int max=10000for(int I=0;i maxI){ string buffer . append(I);if(i max - 1) { stringBuffer.append(,);} } string=string buffer . tostring();long start=system . current time millis();for(int I=0;我10000;i ) { string.split(,);} long end=system . current time millis();System.out.println(结束-开始);}}}经过对上面代码的测试,最终发现用split方法用逗号切割字符串用了2000多毫秒。这个不固定,2300毫秒左右。
JDK提供字符串切割工具类StringTokenizer
然后,我要介绍另一个专门用于字符串切割的性能更好的工具类,即StringTokenizer。这个工具是JDK提供的,也是专门用来切割绳子的。它的性能会更好。我们可以看看下面的代码,用它进行1w的字符串切割,看看具体的性能测试结果:
导入Java . util . string tokenizer;public class StringSplitTest { public static void main(String[]args){ String String=null;string buffer string buffer=new string buffer();int max=10000for(int I=0;i maxI){ string buffer . append(I);if(i max - 1) { stringBuffer.append(,);} } string=string buffer . tostring();long start=system . current time millis();for(int I=0;我10000;i ) { string.split(,);}长结束=系统
em.currentTimeMillis(); System.out.println(end - start); start = System.currentTimeMillis(); StringTokenizer stringTokenizer = new StringTokenizer(string, ","); for(int i = 0; i < 10000; i++) { while(stringTokenizer.hasMoreTokens()) { stringTokenizer.nextToken(); } stringTokenizer = new StringTokenizer(string, ","); } end = System.currentTimeMillis(); System.out.println(end - start); }}大家看上面的代码,用StringTokenizer可以通过hasMoreTokens()方法判断是否有切割出的下一个元素,如果有就用nextToken()拿到这个切割出来的元素,一次全部切割完毕后,就重新创建一个新的StringTokenizer对象。
这样连续切割1w次,经过测试之后,会发现用StringTokenizer切割字符串1w次的耗时大概是1900毫秒左右。
大家感觉如何?是不是看到差距了?换一下切割字符串的方式,就可以让耗时减少400~500ms,性能目前已经可以提升20%了。
手把手带你实现一个更高效的字符串切割工具类
接着我们来自己封装一个切割字符串的函数,用这个函数再来做一次字符串切割看看,大家先看字符串切割函数的代码:
private static void split(String string) { String remainString = string; int startIndex = 0; int endIndex = 0; while(true) { endIndex = remainString.indexOf(",", startIndex); if(endIndex <= 0) { break; } remainString.substring(startIndex, endIndex); startIndex = endIndex + 1; }}
上面那段代码是我们自定义的字符串切割函数,大概意思是说,每一次切割都走一个while循环,startIndex初始值是0,然后每一次循环都找到从startIndex开始的下一个逗号的index,就是endIndex,基于startIndex和endIndex截取一个字符串出来,然后startIndex可以推进到本次endIndex + 1即可,下一次循环就会截取下一个逗号之前的子字符串了。
下面我们用用上述自定义的切割函数再次测试一下,如下代码:
import java.util.StringTokenizer;public class StringSplitTest { public static void main(String[] args) { String string = null; StringBuffer stringBuffer = new StringBuffer(); int max = 10000; for(int i = 0; i < max; i++) { stringBuffer.append(i); if(i < max - 1) { stringBuffer.append(","); } } string = stringBuffer.toString(); long start = System.currentTimeMillis(); for(int i = 0; i < 10000; i++) { string.split(","); } long end = System.currentTimeMillis(); System.out.println(end - start); start = System.currentTimeMillis(); StringTokenizer stringTokenizer = new StringTokenizer(string, ","); for(int i = 0; i < 10000; i++) { while(stringTokenizer.hasMoreTokens()) { stringTokenizer.nextToken(); } stringTokenizer = new StringTokenizer(string, ","); } end = System.currentTimeMillis(); System.out.println(end - start); start = System.currentTimeMillis(); for(int i = 0; i < 10000; i++) { split(string); } end = System.currentTimeMillis(); System.out.println(end - start); } private static void split(String string) { String remainString = string; int startIndex = 0; int endIndex = 0; while(true) { endIndex = remainString.indexOf(",", startIndex); if(endIndex <= 0) { break; } remainString.substring(startIndex, endIndex); startIndex = endIndex + 1; } }}
总结
经过上述代码测试之后,我们自己写的字符串切割函数的耗时大概是在1000ms左右,相比较之下,比String.split方法的性能提升了2倍多,比StringTokenizer的性能也提升了2倍,如果要是字符串更大呢?其实字符串越大,性能差距就会越多,可能会呈更大的倍数提升我们的性能!
以上就是Java实现字符串切割的方法详解的详细内容,更多关于Java字符串切割的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。