Java 自定义切割方法(改进原生切割方法)
package com.phubing; import java.util.StringTokenizer; /** * @Description * @Author phubing * @Date 2022年4月1日 09:24:04 **/ public class StringSplitTest { /** * 拼接出来一个用逗号分隔的超长字符串,把从 0 开始一直到 9999 的每个数字都用逗号分隔,拼接成一个超长的字符串 * @return */ public static String str(){ 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(","); } } return stringBuffer.toString(); } public static void main(String[] args) { split(); stringTokenizer(); myTest(); } public static void split() { String string = str(); long start = System.currentTimeMillis(); for(int i = 0; i < 10000; i++) { string.split(","); } long end = System.currentTimeMillis(); System.out.println("原生split耗时:" + (end - start)); } /** * 用 StringTokenizer 可以通过 hasMoreTokens() 方法判断是否有切割出的下一个元素, * 如果有就用 nextToken() 拿到这个切割出来的元素,一次全部切割完毕后, * 就重新创建一个新的 StringTokenizer 对象。 */ private static void stringTokenizer(){ String string = str(); for(int i = 0; i < 10000; i++) { string.split(","); } long start = System.currentTimeMillis(); StringTokenizer stringTokenizer = new StringTokenizer(string, ","); for(int i = 0; i < 10000; i++) { while(stringTokenizer.hasMoreTokens()) { stringTokenizer.nextToken(); } stringTokenizer = new StringTokenizer(string, ","); } long end = System.currentTimeMillis(); System.out.println("stringTokenizer耗时:" + (end - start)); } public static void myTest() { String string = str(); Long start = System.currentTimeMillis(); for(int i = 0; i < 10000; i++) { customSplit(string); } Long end = System.currentTimeMillis(); System.out.println("自定义字符串切割耗时:" + (end - start)); } /** * 每一次切割都走一个 while 循环,startIndex 初始值是 0,然后每一次循环都找到从 startIndex 开始的下一个逗号的 index, * 就是 endIndex,基于 startIndex 和 endIndex 截取一个字符串出来。 * 然后 startIndex 可以推进到本次 endIndex + 1 即可,下一次循环就会截取下一个逗号之前的子字符串了。 * @param string */ private static void customSplit(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; } } }
最终测试结果: